MDN绑定polyfill如下所示。
我正在努力解决
的目的this instanceof fNOP ? this : oThis
在fToBind.apply
调用中。
我无法理解它。有人能帮忙解决一些问题吗?
Function.prototype.bindMdn = 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 ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
}
;
if (this.prototype) {
// Function.prototype doesn't have a prototype property
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
如果在调用绑定函数时将绑定函数的实例作为目标提供,则似乎是短路,但是类型检查应该捕获这个,所以我不理解它的存在。
链接到MDN页面:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind
修改:这是与建议的副本不同的问题。建议的副本会询问为什么需要fNOP
。我完全理解了这一点。
这个问题是为什么需要进行instanceof
检查以及它所服务的功能。我在上面提出了我的短路假设,以及为什么它没有充分理解。
答案 0 :(得分:4)
如果您使用.bind
的结果来创建new
的新实例:
function TestClass(a,b,c,d) {
}
var TestClassBound = TestClass.bindMdn(null, 1, 2, 3);
new TestClassBound();
然后this instanceof fNOP
为true
。
typeof this !== 'function'
只是用于测试它是否在函数上被调用为常规方式而不是call
或apply
,或者确保它未被复制到另一个对象原型。所以它只能阻止像
Function.prototype.bind.call("Not a function", 1, 2, 3);
或者
var testObj = {};
testObj.bind = Function.prototype.bind;
testObj.bind(1,2,3);
对于bind
对某项功能的每次定期通话,typeof this
始终为function
。
所以typeof this !== 'function'
是检查对象bind
是否真的是一个函数。
this instanceof fNOP
中的fBind
可确保在使用绑定结果时行为正确。