将JavaScript函数传递给对象中的另一个函数会丢失对象变量范围

时间:2016-10-13 03:56:42

标签: javascript variables scope

我有一个执行Facebook身份验证的第三方库,我需要传递一个回调处理程序。这很好,但在回调函数中它不能设置对象的其他参数。

我创建了这个简单的测试,并需要帮助来理解为什么第三种情况不起作用,以模拟我的应用程序中发生的事情。

const Test = {
 uid: null,
 test() {
    this.testAgain(this.updateUID);
 },
 testAgain(updater) {
   updater(7);
 },
 updateUID(id) {
   this.uid = id;
 }
};

alert(Test.uid); // expect null, got null

Test.updateUID(3);
alert(Test.uid); // expect 3, got 3

Test.test();
alert(Test.uid); // expect 7, got 3 ???

我很欣赏有关如何让第3个案例发挥作用的建议。我必须将该函数传递给Facebook auth库,当FB调用该函数时,它需要能够更新对象的参数。

1 个答案:

答案 0 :(得分:2)

当您将该方法作为参数传递时,对该对象的引用将被剥离'可以这么说。因此,当您设置this.uid时,它会在不再“测试”的对象上设置属性。要保留参考,您可以使用bind

test() {
  this.testAgain(this.updateUID.bind(this));
},