我有一个执行 Facebook 身份验证的第 3 方库,我需要向它传递一个回调处理程序。这工作正常,但在回调函数中它不能设置对象的其他参数。
我创建了这个简单的测试,需要帮助来理解为什么第三种情况不起作用,以模拟我的应用程序中发生的情况。
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 ???
我很欣赏有关如何使第三个案例发挥作用的建议。我必须将该函数传递给 Facebook 身份验证库,当 FB 调用该函数时,它需要能够更新对象的参数。
最佳答案
可以这么说,当您将该方法作为参数传递时,对该对象的引用将被“剥离”。因此,当您设置 this.uid 时,它会在不再是“Test”的对象上设置一个属性。要保留引用,您可以使用 bind
test() {
this.testAgain(this.updateUID.bind(this));
},
关于javascript - 将 JavaScript 函数传递给对象内的另一个函数会丢失对象变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40012046/