我正在寻找bind implementation的代码段,并且正在努力了解其工作原理:
// Credit to Douglas Crockford for this bind method
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable 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 && oThis
? this
: oThis,
aArgs.concat (Array.prototype.slice.call (arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP ();
return fBound;
};
}
依次,我有以下问题:
我如何看待this
中的if (typeof this !== "function")
?我的理解是,一般来说this
是指拥有/包含被调用函数的对象。在这种情况下,该对象是:A)。 Function.prototype?或B)。包含要应用绑定的函数的对象(即,如果我们有someFunc.bind(someObj)
,那么上面的this
是否引用了持有someFunc
的对象?除了someFunc
之外还包含许多其他方法吗?如果是这种情况,我们该如何处理this
对象除了我们感兴趣的功能someFunc
之外还拥有许多无关功能的可能性?)
var aArgs = Array.prototype.slice.call (arguments, 1)
。 。 。为什么将1
作为参数传递给call方法?
在fToBind = this
中,我有与上面#1中相同的问题。 this
到底指的是什么 ?
(this instanceof fNOP && oThis)
的目的是什么?我的理解(肯定是错误的)是“真实”的情况是:this
是包含空函数的对象的实例并且o这不是NULL吗?如果是这种情况,为什么导致this
,如果不是,为什么导致oThis
是“假”的情况?
aArgs.concat (Array.prototype.slice.call (arguments))
中的串联是怎么回事? arguments
此处是否引用fBound的参数?如果是这样,为什么我们将它们与bind
方法的参数连接起来(我假设aArgs
表示的是)?
fNOP.prototype = this.prototype; fBound.prototype = new fNOP ()
的作用是什么?
毕竟,在下一行中,该函数返回fBound
。返回fBound
是否意味着我们真的在返回fBound.prototype
(即fNOP()
的新实例,即this.prototype
)?如果是这样,就不会忽略/“覆盖”以下内容:
fBound = function() {
return fToBind.apply (this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat
(Array.prototype.slice.call (arguments)));
}
但是,如果没有,fBound.prototype = new fNOP ()
分配的目的是什么?