首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MDN装填线的解释

MDN装填线的解释
EN

Stack Overflow用户
提问于 2016-07-16 15:03:04
回答 1查看 555关注 0票数 8

MDN绑定填充如下所示。

我正在努力想出

代码语言:javascript
复制
this instanceof fNOP ? this : oThis

fToBind.apply调用中。

我没法把头绕过去。有人能帮我弄清楚吗?

代码语言:javascript
复制
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页面:

objects/Function/bind

编辑:,这是一个与建议的复制不同的问题。建议的重复询问为什么需要fNOP。我完全感觉到了。

这个问题是为什么需要instanceof检查以及它提供什么功能。我在上面提出了我的短路假说,并给出了一个不完全合理的理由。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 15:23:15

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

代码语言:javascript
复制
 function TestClass(a,b,c,d) {
 }

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

 new TestClassBound();

然后this instanceof fNOPtrue

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

代码语言:javascript
复制
Function.prototype.bind.call("Not a function", 1, 2, 3);

代码语言:javascript
复制
var testObj = {};
testObj.bind = Function.prototype.bind;

testObj.bind(1,2,3);

对于函数上的每个常规bind调用,typeof this将始终是function

因此,typeof this !== 'function'将检查调用对象bind是否真的是一个函数。

并且,在使用绑定的结果时,this instanceof fNOPfBind中确保行为是正确的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38412423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档