說到setInterval,就不得不提到setTimeout,二者都是用於定時執行某函數,區別在於setTimeout 只執行一次,而setInterval可以一直連續不斷執行下去,典型用法如下:
function do_sth() { console.log('Hello...'); }
setTimeout(do_sth, 2500); // 2.5 秒後,執行 do_sth 函數(只執行一次) setInterval(do_sth, 3500); // 3.5 秒後,執行 do_sth 函數(每隔 3.5 秒執行一次,一直執行下去)
表面看上去,二者各有各的用途,沒什麼問題。但是如果setInterval所執行的函數是比較耗時的動作,setInterval仍然會按照原計劃安排調用那個函數,而不考慮之前的任何阻塞,這樣隨著時間的推移,隊列中等待執行的函數就會越來越多。而對於此問題解決方案仍然是采用遞歸調用setTimeout 的方法,如:
function do_sth() { console.log('Hello...'); // 即使這裡執行比較耗時的動作也沒問題, // 等這裡執行完了才會再去調用 setTimeout setTimeout(do_sth, 2500); // 安排後續執行 } do_sth(); // 初次執行
這種遞歸調用的方式,既可以達到循環執行某函數的目的,有可以防止後續任務不斷堆積。
如果你覺得這種方式有點羅嗦,還可以再寫得精煉一些:
(function() { console.log('Hello...'); // do something here setTimeout(arguments.callee, 2500); })();
說是這麼說,但是如果定時執行的任務開銷很少,setInterval一般是沒什麼問題的,但是如果任務開銷比較大,請務必使用setTimeout。