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变量中?
它们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)