在 JS 中可以利用 .bind
的方式重新指定 this
的指向,而级联(链式)的 .bind
并不会奏效,只会绑定第一个 bind 的 this
。以下是一种 .bind
的实现:
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable')
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(
this instanceof fNOP ? this : oThis,
aArgs.concat(Array.prototype.slice.call(arguments))
)
}
if (this.prototype) {
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP()
return fBound
}
}
可以看到,若链式进行 .bind
操作,实际的代码会变为一层一层的 apply 嵌套,在此情况下,只有最内层的 apply this 会对原始函数奏效。