function myFunction() {
alert("click");
var zh = setTimeout("myFunction()", 2000); // zh 為區域變數
}
function temp() {
clearTimeout(zh); // 錯誤:zh 不在作用域內
}
var zh; // 全域或模組層級
function myFunction() {
alert("click");
zh = setTimeout(myFunction, 2000); // 直接傳函式參考,避免字串 eval
}
function temp() {
clearTimeout(zh);
}
const TimerModule = (() => {
let timerId = null;
return {
start: () => { timerId = setTimeout(() => { TimerModule.start(); }, 2000); },
stop: () => { clearTimeout(timerId); }
};
})();
若在類別方法中使用 `setTimeout`,請用箭頭函式保持 `this` 指向:
class Counter {
start() {
this.timer = setTimeout(() => this.tick(), 1000);
}
tick() { console.log('tick'); }
}
`setTimeout` 回傳的 ID 必須儲存在可被取消函式存取的作用域中。養成「宣告在外部、傳函式而非字串」的習慣,能避免 90% 的定時器 Bug。