Function.prototype.bind = function() {
var _this = this,
original = _this,
args = Array.prototype.slice.call(arguments),
_obj = args.shift(),
func = function() {
var _that = _obj;
return original.apply(_that, args.concat(
Array.prototype.slice.call(
arguments, args.length)));
};
func.bind = function() {
var args = Array.prototype.slice.call(arguments);
return Function.prototype.bind.apply(_this, args);
}
return func;
};
我知道这是一个绑定函数。但我不明白它以及它在做什么,特别是
args.concat
部分。 concat
有什么作用?另外,.bind
方法能做什么而.apply
和.call
不能呢?
bind
函数接受一个函数并确保它始终绑定到特定的this
值。最简单的例子是事件处理程序。默认情况下,事件处理程序的 this
值绑定到 window
。但是,假设您想使用对象的方法作为侦听器,并在该侦听器中更改一些属性:
var thing = {
answer : 4,
listener : function() {
this.answer = 42;
}
}
window.onload = thing.listener;
在 onload 事件中,
thing.answer
没有按预期更改,window.answer
现在为 42。因此,我们使用 bind
:
window.onload = thing.listener.bind(thing);
因此,
bind
返回一个函数,当调用该函数时,会调用原始函数,但具有指定的this
值。
[].concat
只是将参数添加到数组中 - 因此 [].concat(5, 4)
返回 [5, 4]
,而 [5, 4].concat([42])
返回 [5, 4, 42]
。在本例中,它用于连接参数 - 您可以将参数传递给 bind
函数,该函数将在调用函数时作为参数传递。连接起作用,以便当您调用绑定函数时,您现在传递的参数也会一起传递。
它似乎是 Function.bind()
的
垫片。
但我不明白它以及它在做什么,特别是
部分。 concat 有什么作用?args.concat
Array.concat()
连接两个或多个 Array
(以及其他值到 Array
)。
另外,
方法能做什么而.bind
和.apply
不能做到?.call
它返回对函数的引用,其中
this
绑定到您想要的任何内容。
var newFn = fn.bind(['a', 'b', 'c']);
// This will call `fn()` with the above `Array` as `this`.
newFn('first arg', 'second arg');
它对于柯里化很有用,例如返回一个已设置参数的函数(除了在
this
中设置 bind()
之外,您还可以设置默认参数)。