【问题标题】: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 运行它的回调时,它会在“全局”上下文中运行(this 是window)。
这里的解决方案是使用.bind() 来“锁定”this 值。
baz(obj.bar.bind(obj));
【解决方案2】:
因为你需要将回调绑定到特定的对象。
baz(obj.bar.bind(obj));
仅当您在同一表达式中执行调用时,函数才会自动绑定到 . 之前的对象。简单地访问属性并不会绑定它。