Javascript 原型;绑定";方法问题
这个函数是原型。它是否等于:Javascript 原型;绑定";方法问题,javascript,prototype,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(a
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))**);
};
};
在我看来,args.concat(Array.prototype.slice.call(arguments))==args
,因为匿名
函数没有任何参数。怎么了?不,它们不一样 t串联参数的目的是提供一种(或)函数的方法,在使用
bind
时预先填充参数,并能够在以后使用bind
返回的函数时添加更多参数,例如:
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object,**args**);
};
};
正如您在最后两行代码中看到的,当我声明fx2
时,我将obj
作为第一个参数传递(这将确保上下文,用作bind
实现上的对象
变量),然后传递值1
、2
和3
这些值存储在bind
外部闭包的args
变量中,然后正如您在bind
实现中看到的那样,返回另一个函数
在我的示例中,赋值后返回的函数是fx2
,在最后一行中,您可以看到我调用该函数,并传递另外两个参数
最后,返回的函数将使用两个参数列表调用obj.fx
、调用bind
时预先填充的参数(1
、2
、3
)以及函数实际执行时的参数(4
、5
)
这就是为什么连接两个参数对象是有意义的。不,它们不一样 t串联参数的目的是提供一种(或)函数的方法,在使用
bind
时预先填充参数,并能够在以后使用bind
返回的函数时添加更多参数,例如:
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object,**args**);
};
};
正如您在最后两行代码中看到的,当我声明fx2
时,我将obj
作为第一个参数传递(这将确保上下文,用作bind
实现上的对象
变量),然后传递值1
、2
和3
这些值存储在bind
外部闭包的args
变量中,然后正如您在bind
实现中看到的那样,返回另一个函数
在我的示例中,赋值后返回的函数是fx2
,在最后一行中,您可以看到我调用该函数,并传递另外两个参数
最后,返回的函数将使用两个参数列表调用obj.fx
、调用bind
时预先填充的参数(1
、2
、3
)以及函数实际执行时的参数(4
、5
)
这就是为什么连接两个参数对象是有意义的
匿名函数没有任何参数
匿名函数实际上可以有参数(就像bind
方法本身一样,它也不声明任何参数)
JavaScript中的类型检查不存在:您可以向函数中传递的参数少于函数(…)
签名中声明的参数(在这种情况下,未传递的参数将作为未定义的
接收),并且您可以传递多于声明的参数,在这种情况下,读取它们的唯一方法是通过arguments
数组,该数组始终精确地包含传入的参数数量,而不管函数签名中包含什么
通常认为在签名(函数(x,/*y,*/)
)中添加注释是礼貌的,以表明将使用参数
数组读取更多参数
匿名函数没有任何参数
匿名函数实际上可以有参数(就像bind
方法本身一样,它也不声明任何参数)
JavaScript中的类型检查不存在:您可以向函数中传递的参数少于函数(…)
签名中声明的参数(在这种情况下,未传递的参数将作为未定义的
接收),并且您可以传递多于声明的参数,在这种情况下,读取它们的唯一方法是通过arguments
数组,该数组始终精确地包含传入的参数数量,而不管函数签名中包含什么
通常认为在签名(函数(x,/*y,*/)
)中添加注释是礼貌的,以表明将使用参数
数组读取更多参数