您不了解JS书,可以简化“ this”绑定

时间:2018-11-11 18:43:32

标签: javascript

这本书YDKJS包含描述soft binding实用程序的部分:

if (!Function.prototype.softBind) {
    Function.prototype.softBind = function(obj) {
        var fn = this,
            curried = [].slice.call( arguments, 1 ),
            bound = function bound() {
                return fn.apply(
                    (!this ||
                        (typeof window !== "undefined" &&
                            this === window) ||
                        (typeof global !== "undefined" &&
                            this === global)
                    ) ? obj : this,
                    curried.concat.apply( curried, arguments )
                );
            };
        bound.prototype = Object.create( fn.prototype );
        return bound;
    };
}

我无法理解以下行:curried.concat.apply( curried, arguments )。为什么我们将已经咖喱的论点与 arguments对象,而不是简单地使用curried数组:

...
        ) ? obj : this,
        curried
    );
};
bound.prototype = Object.create( fn.prototype );
...

1 个答案:

答案 0 :(得分:2)

调用绑定函数时,首先会传递绑定参数,然后是从调用到绑定版本的新参数。

function log(a, b, c, d, e) {
    console.log([a, b, c, d, e]);
}

log(1, 2, 3, 4, 5);

const bound = log.bind(null, 1, 2, 3);

bound(4, 5);

如果您不使用边界参数和新参数,则只能记录1、2和3。