點擊按鈕啟動 `setInterval`,每 3 秒更新多個進度條。前 4 次正常,之後頁面凍結(進度條不動),但 Console 仍輸出計數器遞增,說明定時器仍在執行。
定時器回調函數執行時間超過間隔時間(3 秒),導致 JavaScript 主線程持續佔用,無法釋放給瀏覽器渲染引擎重繪頁面。 瀏覽器單線程模型下,長時間運行的同步代碼會阻塞 UI 更新。
function updateProgress() {
// ... 原有的 for 迴圈更新進度條邏輯 ...
// 遞迴安排下一次執行,確保本次完全結束後再排程
setTimeout(updateProgress, steptime);
}
// 啟動
$("#trybtn").click(function () {
updateProgress();
});
| 特性 | setInterval | setTimeout 遞迴 |
|---|---|---|
| 執行保證 | 固定間隔嘗試執行,若上次未結束會堆疊 | 上次完全結束後,再等待指定時間啟動下一次 |
| 阻塞風險 | 高,長任務導致併發執行、主線程耗盡 | 低,天然串行,留出渲染機會 |
| 適用場景 | 極短、固定頻率任務 | 耗時不定、需保證 UI 響應的任務 |