为什么传递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));
只有在同一表达式中执行调用时,函数才会自动绑定到
之前的对象。仅访问属性不会绑定属性。

请参见此处:请参见此处: