目前有兩種方式可以實作:
允許我們将函數推遲到一段時間間隔之後再執行。
setTimeout
允許我們重複運作一個函數,從一段時間間隔之後開始運作,之後以該時間間隔連續重複運作該函數。
setInterval
setTimeout:
文法:
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
參數說明:
func|code
想要執行的函數或代碼字元串。 一般傳入的都是函數。由于某些曆史原因,支援傳入代碼字元串,但是不建議這樣做。
delay
執行前的延時,以毫秒為機關(1000 毫秒 = 1 秒),預設值是 0;
arg1
,
arg2
…
要傳入被執行函數(或代碼字元串)的參數清單(IE9 以下不支援)
例如,在下面這個示例中,
sayHi()
方法會在 1 秒後執行:
<!DOCTYPE html>
<script>
"use strict";
function sayHi() {
alert('Hello');
}
setTimeout(sayHi, 1000);
</script>
clearTimeout取消排程:
let timerId = setTimeout(...);
clearTimeout(timerId);
setInteval
文法:
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
<!DOCTYPE html>
<script>
"use strict";
// 每 2 秒重複一次
let timerId = setInterval(() => alert('tick'), 2000);
// 5 秒之後停止
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);
</script>
嵌套的setTimeout
/** instead of:
let timerId = setInterval(() => alert('tick'), 2000);
*/
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
setTimeout可以嵌套,但是setInterval不可以。
零延時的用法:
這兒有一種特殊的用法:
setTimeout(func, 0)
,或者僅僅是
setTimeout(func)
。
總結
和
setTimeout(func, delay, ...args)
方法允許我們在
setInterval(func, delay, ...args)
毫秒之後運作
delay
一次或以
func
毫秒為時間間隔周期性運作
delay
。
func
- 要取消函數的執行,我們應該調用
,并将
clearInterval/clearTimeout
傳回的值作為入參傳入。
setInterval/setTimeout
- 嵌套的
比
setTimeout
用起來更加靈活,允許我們更精确地設定兩次執行之間的時間。
setInterval
- 零延時排程
(與
setTimeout(func, 0)
相同)用來排程需要盡快執行的調用,但是會在目前腳本執行完成後進行調用。
setTimeout(func)
- 浏覽器會将
或
setTimeout
的五層或更多層嵌套調用(調用五次之後)的最小延時限制在 4ms。這是曆史遺留問題。
setInterval
請注意,所有的排程方法都不能 保證 确切的延時。
例如,浏覽器内的計時器可能由于許多原因而變慢:
- CPU 過載。
- 浏覽器頁簽處于背景模式。
- 筆記本電腦用的是電池供電(譯注:使用電池供電會以降低性能為代價提升續航)。
所有這些因素,可能會将定時器的最小計時器分辨率(最小延遲)增加到 300ms 甚至 1000ms,具體以浏覽器及其設定為準。