【问题标题】:Why does passing a JavaScript object's method not update the object? [duplicate]为什么传递 JavaScript 对象的方法不会更新对象? [复制]
【发布时间】:2017-05-25 07:11:36
【问题描述】:

我注意到,当将对象的方法(更新对象自身的属性之一)作为参数传递给另一个函数时,原始对象不会被修改。

例如:

var obj = {
    foo: 0,
    bar: function () {
        this.foo++;
    }
};

function baz(callback) {
    callback();
}

baz(obj.bar); // does not alter obj
obj.bar(); // increments obj.foo successfully
console.log(obj.foo); // should be 2, not 1

为什么会这样,因为 JavaScript 对象是通过引用传递的?

【问题讨论】:

标签: javascript object parameter-passing instance-variables


【解决方案1】:

这是因为函数的上下文 - 或 this 值 - 基于它的调用方式,而不是它的定义方式。您的 bar 函数不知道它在 obj 对象内。

当您使用obj.bar(); 时,您obj 的上下文中调用它,因此this 是您所期望的。

当您执行baz(obj.bar); 时,您将bar 函数作为参数传递。它不再与obj 对象有任何联系。请记住,函数可以被视为变量。因此,当baz 运行它的回调时,它会在“全局”上下文中运行(thiswindow)。

这里的解决方案是使用.bind() 来“锁定”this 值。

baz(obj.bar.bind(obj));

【讨论】:

    【解决方案2】:

    因为你需要将回调绑定到特定的对象。

    baz(obj.bar.bind(obj));
    

    仅当您在同一表达式中执行调用时,函数才会自动绑定到 . 之前的对象。简单地访问属性并不会绑定它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-16
      • 2020-01-11
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2012-09-01
      相关资源
      最近更新 更多