【问题标题】:Is Call/Apply preferable to passing context?调用/应用比传递上下文更可取吗?
【发布时间】:2013-08-01 07:40:21
【问题描述】:

我会用一些代码来开始它。让我们有一个对象:

function SomeObject() {
    this.arbitraryVarINeed = 5;
}

现在一种方法是:

SomeObject.prototype.stuffToBeDone() {
    var context = this;
    function heyThere() {
        console.log(context.arbitraryVarINeed);
    }
    heyThere();
}

和其他:

SomeObject.prototype.stuffToBeDone() {
    function heyThere() {
        console.log(this.arbitraryVarINeed);
    }
    heyThere.call(this);
}

现在在这个简单的例子中,显然调用更可取。但是这样怎么样,.call/.apply 还适用吗?

SomeObject.prototype.stuffToBeDone() {
    var hello = document.createElement("brofist");
    var context = this;
    hello.onBroEvent = function (event) {
        event.target.innerBro = context.arbitraryVarINeed;
    }
}

如果我必须在重复使用 .call/.apply 或只是保存保存在某处的上下文之间进行选择,我应该选择前者还是后者?什么是快速、安全的选择,这两种方法中的一种是否比另一种更好?

事实证明,感谢 Jakob 的回答,事件/匿名函数示例也可以通过 .bind 解决。那么到底是不是绝对不需要传递上下文呢?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    不是您问题的完整答案,但至于您的最后一个示例,还有第三种方法。和你自己猜的一样,call/apply真的不能用,但可以用bindhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

    像这样:

    SomeObject.prototype.stuffToBeDone() {
        var hello = document.createElement("brofist");
        var context = this;
        hello.onBroEvent = (function(event) {
            event.target.innerBro = this.arbitraryVarINeed;
        }).bind(this);
    }
    

    【讨论】:

    • Bind 基本上只是将上下文保存在闭包中。 IIRC,绑定可以像这样填充(为了清楚起见,不使用原型):function bind(fn, target) { return function() { return fn.call(target, arguments); } }.
    • 您或多或少地说出了我在寻找什么,即使这个问题仍未得到解答。我怀疑这种情况很快就会改变,所以你去吧。
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2012-09-30
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多