以下代码(来自msdn)是'bind'函数的简单实现:
/* Approximation of `Function.prototype.bind` from ES5 (without error checking) */
Function.prototype.bind = function(thisArg) {
var fn = this, args = *Array.prototype.slice.call(arguments, 1)*;
return function() {
return fn.apply(thisArg, args.concat(*Array.prototype.slice.call(arguments, 0)*));
};
};
有人能解释第一次调用Array.prototype.slice.call吗?我理解参数不是数组,需要在使用slice和concat之前将其转换为数组。我不明白第一个电话 - 我们不是在调用
时丢失了第一个元素Array.prototype.slice.call(arguments, 1)?
答案 0 :(得分:0)
你是对的。
arguments
的第0个元素是thisArg
,这就是它被移除的原因。
答案 1 :(得分:0)
根据有关bind
的文档,第一个参数(arguments[0]
)是自定义this
值,用作返回函数中this
的值by bind
(“绑定函数”)。
后面的内容(arguments[1]
- arguments[n]
)除了调用时提供的参数外,还是在调用绑定函数时要添加的参数。
第一个Array.prototype.slice.call
做的是对传递给bind
调用的参数进行切片,并从传递的第二个参数开始获取要添加的参数,留下第一个参数,即this
1}}。
例如
var newFN = someFunction.bind(myNewThis,foo,bar,baz);
第一个Array.prototype.slice.call
需要foo
,bar
和baz
。
在返回的函数中,foo
,bar
和baz
会在调用绑定函数时提供给参数:
//fn - original function
//args - extracted arguments foo, bar and baz
//thisArg - the provided `this` value, myNewThis
//this code basically:
// - calls the original function (fn)
// - provides a custom `this` value (thisArg)
// - provides arguments that comprise the extracted arguments + the passed arguments
fn.apply(thisArg, args.concat(Array.prototype.slice.call(arguments, 0)));
因此,当您使用新的“绑定”函数时,您将获得自定义this
值以及“预设”前置参数列表:
newFN('ban','bam'); //arguments === ['foo','bar','baz','ban','bam'];