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,*/)
)中添加注释是礼貌的,以表明将使用
参数
数组读取更多参数