開發者將 setInterval 定時器放置於 chgCol() 函數內部,導致每次呼叫該函數都會建立新的定時器,造成:
function chgCol() {
// 業務邏輯...
setInterval(function() {
chgCol(); // 遞迴呼叫,且每次都新建定時器
}, 1000);
}
// 外部呼叫
chgCol(); // 第一次建立定時器
// 1 秒後定時器觸發 -> 再次呼叫 chgCol() -> 再建立一個定時器...指數級增長
// 定時器變數提升至模組/類別層級
let colorTimer = null;
function startColorChange() {
// 防止重複啟動
if (colorTimer) return;
colorTimer = setInterval(() => {
chgCol(); // 僅執行色彩變換邏輯
}, 1000);
}
function stopColorChange() {
if (colorTimer) {
clearInterval(colorTimer);
colorTimer = null;
}
}
function chgCol() {
// 純色彩變換邏輯,無定時器建立
document.body.style.backgroundColor = getRandomColor();
}
setInterval/setTimeout 應在初始化或啟動函數中建立,不應置於被重複呼叫的函數內clearIntervalsetInterval 而非 setTimeout 遞迴若涉及視覺動畫(如顏色漸變),建議改用 requestAnimationFrame:
let animationId = null;
function animateColor() {
// 計算插值顏色...
animationId = requestAnimationFrame(animateColor);
}
function stopAnimation() {
cancelAnimationFrame(animationId);
}