旧版本的 bind polyfill 实现中,为什么不检查 this instanceof fBound?

发布于 2022-09-12 23:48:41 字数 1275 浏览 26 评论 0

这个是 MDN 中旧版本的 bind polyfill 的实现代码:

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;
    };
}

这里的 this instanceof fNOP 是为了判断调用 bind 之后返回的函数是正常调用还是 new 调用,如果是 new 调用,则 this 就是调用完生成的实例,由于原型链的关系,这个语句会返回 true。但既然是这个目的的话,为什么不直接检查 this insatnceof fBound 呢?这样好像更直接一点。还是说这里两种检查方式都可以,没有区别呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文