MDN在调用apply时绑定为什么使用concat参数

Mat*_*att 5 javascript bind apply

MDN为没有本机绑定方法的浏览器指定了polyfill绑定方法:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

此代码包含以下行:

aArgs.concat(Array.prototype.slice.call(arguments))
Run Code Online (Sandbox Code Playgroud)

哪个作为args传递给函数的apply方法:

fToBind.apply(this instanceof fNOP && oThis
                             ? this
                             : oThis,
                           aArgs.concat(Array.prototype.slice.call(arguments)));
Run Code Online (Sandbox Code Playgroud)

但是,这一行实际上重复了参数,所以如果我将bind方法调用为:

fnX.bind({value: 666}, 1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

传递给fnX的参数是:

[1, 2, 3, Object, 1, 2, 3] 
Run Code Online (Sandbox Code Playgroud)

运行以下示例并查看控制台输出http://jsfiddle.net/dtbkq/

然而,fnX报告的参数是[1,2,3],这是正确的.有人可以解释为什么传递给apply调用时args是重复的但是没有出现在函数arguments变量中?

ale*_*lex 4

它们arguments处于两种不同的环境中。每次调用函数时,除其他外,都会将一个arguments对象设置为传递的所有参数(如果arguments访问)。

第一次提到的arguments是 的参数bind(),它将成为初始参数。

第二个提到的是在绑定代理函数上调用的下一组参数。因为arguments名称会隐藏其父级arguments(以及this需要分离的上下文),所以它们存储在名称下aArgs

这允许部分函数应用(有时称为柯里化)。

var numberBases = parseInt.bind(null, "110");

console.log(numberBases(10));
console.log(numberBases(8));
console.log(numberBases(2));
Run Code Online (Sandbox Code Playgroud)

js小提琴