试图了解绑定方法的基础代码

时间:2019-02-18 22:45:34

标签: javascript

我正在寻找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;
    };
}

依次,我有以下问题:

  1. 我如何看待this中的if (typeof this !== "function")?我的理解是,一般来说this是指拥有/包含被调用函数的对象。在这种情况下,该对象是:A)。 Function.prototype?或B)。包含要应用绑定的函数的对象(即,如果我们有someFunc.bind(someObj),那么上面的this是否引用了持有someFunc的对象?除了someFunc之外还包含许多其他方法吗?如果是这种情况,我们该如何处理this对象除了我们感兴趣的功能someFunc之外还拥有许多无关功能的可能性?)

  2. var aArgs = Array.prototype.slice.call (arguments, 1)。 。 。为什么将1作为参数传递给call方法?

  3. fToBind = this中,我有与上面#1中相同的问题。 this到底指的是什么

  4. (this instanceof fNOP && oThis)的目的是什么?我的理解(肯定是错误的)是“真实”的情况是:this是包含空函数的对象的实例并且o这不是NULL吗?如果是这种情况,为什么导致this,如果不是,为什么导致oThis是“假”的情况?

  5. aArgs.concat (Array.prototype.slice.call (arguments))中的串联是怎么回事? arguments此处是否引用fBound的参数?如果是这样,为什么我们将它们与bind方法的参数连接起来(我假设aArgs表示的是)?

  6. 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 ()分配的目的是什么?

0 个答案:

没有答案