为什么传递JavaScript对象的方法不更新对象?

时间:2017-01-10 17:34:26

标签: javascript object parameter-passing instance-variables

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

例如:

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对象是通过引用传递的?

2 个答案:

答案 0 :(得分:2)

这是因为某个功能的上下文 - 或this值是基于其调用的方式,而不是基于定义方式。您的bar功能在obj对象内部无法识别。

当您执行obj.bar();时,您在 obj的上下文中将其称为,因此this就是您所期望的。

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

此处的解决方案是使用.bind()来锁定"" this值。

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

答案 1 :(得分:0)

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

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

当您在同一表达式中执行调用时,函数仅在.之前自动绑定到对象。只需访问该属性就不会绑定它。