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
,因为匿名
函数没有任何参数。怎么了?
答案 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
实现上的变量},然后我传递值bind
,1
和2
。
这些值存储在3
外部封闭的args
变量中,然后如bind
实现中所示,返回另一个函数。
在我的例子中返回的那个函数在赋值后是bind
,在你看到我调用该函数的最后一行,传递两个额外的参数。
最后,返回的函数将使用两个参数列表调用fx2
,这两个参数列表是我们在调用obj.fx
时预先填充的参数(bind
,1
,{{1} })和函数实际执行时的参数(2
,3
)。
这就是为什么有意义地连接两个参数对象。
答案 1 :(得分:1)
匿名函数没有任何参数
匿名函数可以实际上有参数(就像bind
方法本身一样,它也不会声明任何参数)。
JavaScript中的类型检查不存在:您可以将更少的参数传递给函数,而不是function(...)
签名中声明的参数(在这种情况下,未传递的参数将被接收为{{1}你可以传递多于声明的内容,在这种情况下,读取它们的唯一方法是通过undefined
数组,它总是包含传入的参数数量,无论函数签名中包含什么。< / p>
在签名(arguments
)中添加注释通常被认为是礼貌的,以表明将使用function(x, /* y, ... */)
数组读取更多参数。