3 回答

TA貢獻1825條經驗 獲得超4個贊
將function創建一個新的上下文。您需要切換到箭頭功能并使用this.signOut(). 簡化示例:
timer() {
var counter = -1;
var timeout;
var startTimer = () => {
counter++;
console.log(counter);
this.signOut();
timeout = setTimeout(startTimer, 1000);
};
setTimeout(startTimer, 1000);
}
此外,您signOut()在一個類中定義了兩個方法。

TA貢獻1877條經驗 獲得超6個贊
該startTimer功能全不中的上下文中運行HeaderComponent的實例。 thisinstartTimer將指向window它作為 in 中的處理程序執行的時間setTimeout。
為了訪問 的實例HeaderComponent,要么使用箭頭函數(如之前的答案中所指出的那樣。另見箭頭函數表達式),它將指向this外部上下文(即HeaderComponent的實例)或定義一個標識符,timer其中指向到實例(例如const self = this;)并使用self而不是thisin startTimer。
將此應用于您的示例(為了保持一致性,我使用了var代替const):
timer() {
var counter = -1;
var timeout;
var self = this;
var startTimer = function() { // Don't use a named function here, it only leads to more confusion
counter++;
console.log(counter);
self.signOut(); // Use `this` of the outer context
timeout = setTimeout(startTimer, 10000); // Use the declared identifier
};
// Rest of the method
}
this對于那些來自不同編程語言的人來說,Javascript 可能有點混亂。如果您想了解更多細節,我建議您閱讀MDN 參考資料this和Closures
添加回答
舉報