原型“绑定”方法问题

时间:2009-12-06 07:13:51

标签: javascript prototype

Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    return function(){
        return fn.apply(object,
            **args.concat(Array.prototype.slice.call(arguments))**);
    };
};

此功能在Prototype中。它是否等于:

Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    return function(){
        return fn.apply(object,**args**);
    };
};

在我看来,args.concat(Array.prototype.slice.call(arguments)) == args,因为匿名 函数没有任何参数。怎么了?

2 个答案:

答案 0 :(得分:4)

不,他们不一样。

连接参数的目的是提供partially apply(或curry)函数的方法,在使用bind时预先填充参数并在以后添加更多参数当使用bind返回的函数时,例如:

var obj = {
  fx: function() {
    alert(Array.prototype.join.call(arguments, ', '));
  }
};

var fx2 = obj.fx.bind(obj, 1, 2, 3);
fx2(4, 5); // Alerts "1, 2, 3, 4, 5"

正如您在前两行代码中所看到的,当我声明fx2时,我将obj作为第一个参数传递(这将确保上下文,用作{{1 object实现上的变量},然后我传递值bind12

这些值存储在3外部封闭的args变量中,然后如bind实现中所示,返回另一个函数。

在我的例子中返回的那个函数在赋值后是bind,在你看到我调用该函数的最后一行,传递两个额外的参数。

最后,返回的函数将使用两个参数列表调用fx2,这两个参数列表是我们在调用obj.fx时预先填充的参数(bind1,{{1} })和函数实际执行时的参数(23)。

这就是为什么有意义地连接两个参数对象。

答案 1 :(得分:1)

  

匿名函数没有任何参数

匿名函数可以实际上有参数(就像bind方法本身一样,它也不会声明任何参数)。

JavaScript中的类型检查不存在:您可以将更少的参数传递给函数,而不是function(...)签名中声明的参数(在这种情况下,未传递的参数将被接收为{{1}你可以传递多于声明的内容,在这种情况下,读取它们的唯一方法是通过undefined数组,它总是包含传入的参数数量,无论函数签名中包含什么。< / p>

在签名(arguments)中添加注释通常被认为是礼貌的,以表明将使用function(x, /* y, ... */)数组读取更多参数。