2016-10-13 18 views
0

我有一個執行Facebook身份驗證的第三方庫,我需要將它傳遞給回調處理程序。這工作正常,但在回調函數中,它不能設置對象的其他參數。將JavaScript函數傳遞給對象內的其他函數失去對象變量作用域

我創建了這個簡單的測試,並且需要幫助來理解爲什麼第三種情況不起作用,以模擬我的應用中發生了什麼。

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 auth庫,當FB調用該函數時,它需要能夠更新對象的參數。

回答

2

當您將該方法作爲參數傳遞時,對該對象的引用會被「剝離」。所以當你設置this.uid時,它將在不再是'Test'的對象上設置一個屬性。爲了保持您可以使用的參考bind

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

這工作。謝謝。我會在5分鐘內接受答案。 –