我注意到,当将对象的方法(将对象自己的某个属性更新)作为参数传递给另一个函数时,原始对象将不会被修改。
例如:
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对象是通过引用传递的?
答案 0 :(得分:2)
这是因为某个功能的上下文 - 或this
值是基于其调用的方式,而不是基于的定义方式。您的bar
功能在obj
对象内部无法识别。
当您执行obj.bar();
时,您在 obj
的上下文中将其称为,因此this
就是您所期望的。
执行baz(obj.bar);
时,您将bar
函数作为参数传递。它不再与obj
对象有任何联系。请记住,函数可以像变量一样对待。因此,当baz
运行其回调时,它会在"全局"中运行。上下文(this
是window
)。
此处的解决方案是使用.bind()
来锁定"" this
值。
baz(obj.bar.bind(obj));
答案 1 :(得分:0)
因为您需要将回调绑定到特定对象。
baz(obj.bar.bind(obj));
当您在同一表达式中执行调用时,函数仅在.
之前自动绑定到对象。只需访问该属性就不会绑定它。