MDN绑定polyfill中的行的说明

时间:2016-07-16 15:03:04

标签: javascript

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检查以及它所服务的功能。我在上面提出了我的短路假设,以及为什么它没有充分理解。

1 个答案:

答案 0 :(得分:4)

如果您使用.bind的结果来创建new的新实例:

 function TestClass(a,b,c,d) {
 }

 var TestClassBound = TestClass.bindMdn(null, 1, 2, 3);

 new TestClassBound();

然后this instanceof fNOPtrue

typeof this !== 'function'只是用于测试它是否在函数上被调用为常规方式而不是callapply,或者确保它未被复制到另一个对象原型。所以它只能阻止像

这样的东西
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可确保在使用绑定结果时行为正确。