为什么传递JavaScript对象';方法不更新对象?
我注意到,当将对象的方法(更新对象自身的一个属性)作为参数传递给另一个函数时,原始对象不会被修改 例如:为什么传递JavaScript对象';方法不更新对象?,javascript,object,parameter-passing,instance-variables,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 success
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对象是通过引用传递的?这是因为函数的上下文(或
此
值)是基于调用它的方式,而不是定义它的方式。您的bar
函数不知道它在obj
对象中
当您执行obj.bar()时
,您在obj
的上下文中调用它,因此这就是您所期望的
当您执行baz(对象栏)时
,则您将条
函数作为参数传递。它不再与obj
对象有任何关联。记住,函数可以像变量一样处理。因此,当baz
运行其回调时,它会在“全局”上下文中运行(这是窗口
)
这里的解决方案是使用.bind()
来“锁定”该值
baz(obj.bar.bind(obj));
这是因为函数的上下文(或This
value)是基于它的调用方式,而不是基于它的定义方式。您的bar
函数不知道它在obj
对象中
当您执行obj.bar()时
,您在obj
的上下文中调用它,因此这就是您所期望的
当您执行baz(对象栏)时
,则您将条
函数作为参数传递。它不再与obj
对象有任何关联。记住,函数可以像变量一样处理。因此,当baz
运行其回调时,它会在“全局”上下文中运行(这是窗口
)
这里的解决方案是使用.bind()
来“锁定”该值
baz(obj.bar.bind(obj));
因为需要将回调绑定到特定对象
baz(obj.bar.bind(obj));
只有在同一表达式中执行调用时,函数才会自动绑定到
之前的对象。简单地访问属性不会绑定它。因为需要将回调绑定到特定对象
baz(obj.bar.bind(obj));
只有在同一表达式中执行调用时,函数才会自动绑定到
之前的对象。仅访问属性不会绑定属性。请参见此处:请参见此处: