2009-12-06 42 views
1
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,因为匿名 功能没有任何参数。有什么事?

回答

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作为第一个参数(这将确保的背景下,作为object变量上bind实施),然后我传递值1,23

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

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

最后调用bind123)和参数时,当函数实际执行(45)返回的函数将调用obj.fx与两个参数列表中,我们的参数预先填充。

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

1

匿名函数没有任何参数

匿名功能可以实际上有参数(如可在bind方法本身,这也没有声明任何参数)。

JavaScript中的类型检查是不存在的:您可以传递比function(...)签名中声明的参数更少的参数(在这种情况下,未传递的参数将作为undefined接收),并且您可以传递多于声明,在这种情况下,读取它们的唯一方法是通过arguments数组,该数组始终包含确切地传入了多少个参数,而不管函数签名中的内容如何。

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