使用bind枚举绑定参数

时间:2015-07-24 14:58:59

标签: javascript

在JavaScript中,我可以枚举函数的绑定参数吗?

function foo(a, b) {}

foo = foo.bind(null, '1');

如何判断a已被绑定到' 1'?

3 个答案:

答案 0 :(得分:0)

不确定我是否正确理解了您的问题。但是,这是获取函数的所有当前绑定参数的一种hacky方法。

它的工作原理是覆盖本机绑定方法并将所有绑定参数存储在新绑定函数的属性中。

Function.prototype.bind = (function() {
    var bind = Function.prototype.bind;
    var slice = Array.prototype.slice;
    return function() {
        // bind the function using the native bind
        var bound = bind.apply(this, arguments);

        // store the bound arguments in a property of the bound function
        bound.bArgs = (this.bArgs || []).concat(slice.call(arguments, 1));

        return bound;
    };
})();

function foo(a, b) {}

foo = foo.bind(null, '1');
console.log(foo.bArgs); // ["1"]

foo = foo.bind(null, '2');
console.log(foo.bArgs); // ["1", "2"]

http://jsfiddle.net/49d1xfns/

答案 1 :(得分:0)

你做不到。该函数被简单地调用传递某个this值和可选的某些参数值:它不是被调用函数的问题,以区分传递这些值...

为简化一点,请考虑以下问题:

function add(x, y) {
    return x + y;
}

function bind_first(f, x) {
    return function(y) { return f(x, y); };
}

var add3 = bind_first(add, 3);
console.log(add3(2)); // ==> output is 5

add函数像往常一样用两个参数调用...它们都来自bind_first创建的匿名闭包的主体,它没有什么值得关注{{1}这个匿名闭包如何计算这些参数的值...从外面得到它们?被捕获的变量?他们自己计算?是常数?......谁关注!

换句话说,如果你想区分一个约束参数和一个常规参数,你的设计肯定有问题(这不关你的事:-))。

答案 2 :(得分:0)

要知道有多少显式参数绑定到特定函数,您需要知道:

  • 原始函数中显式参数的数量
  • 绑定函数中显式参数的数量

如果您可以访问原始函数和新绑定函数,则可以实现此目的。这也假定绑定是通过符合ES5的Function.prototype.bind调用完成的。

你弄清楚哪些参数被绑定的方法是从原始函数的长度中减去新绑定函数的长度:

var foo = function (a, b, c) {...};
var bar = foo.bind(fizz, buzz);
var argumentsBound = foo.length - bar.length; // 1
var argumentNames = ['a', 'b', 'c'].slice(0, argumentsBound); // 'a'

有关其工作原理的详细信息,请参阅ES5 spec (15.3.4.5, #15)

  
      
  1. 如果目标的[[Class]]内部属性为“Function”,则      
        
    1. L 目标的长度属性减去 A 的长度。
    2.   
    3. F 的长度属性设置为0或 L ,以较大者为准。
    4.   
  2.   

所有这一切都说,这根本没有提供很多访问权限的属性,并且在原始函数(我上面的例子中为foo)中几乎没用,因为原始函数可能不应该' t参考约束导数函数。

如果没有在函数上定义参数,这也没有任何帮助。如果您使用arguments传递其他参数,则length属性不再相关。