天天看點

javascript之排程:setTimeout 和 setInterval

目前有兩種方式可以實作: 

  • 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

     或 

    setInterval

     的五層或更多層嵌套調用(調用五次之後)的最小延時限制在 4ms。這是曆史遺留問題。

請注意,所有的排程方法都不能 保證 确切的延時。

例如,浏覽器内的計時器可能由于許多原因而變慢:

  • CPU 過載。
  • 浏覽器頁簽處于背景模式。
  • 筆記本電腦用的是電池供電(譯注:使用電池供電會以降低性能為代價提升續航)。

所有這些因素,可能會将定時器的最小計時器分辨率(最小延遲)增加到 300ms 甚至 1000ms,具體以浏覽器及其設定為準。