定時器(setTimeout/setInterval)最小延遲的問題

狂刀二發表於2019-01-09

HTML5規範中規定

If timeout is less than 0, then set timeout to 0.
If nesting level is greater than 5, and timeout is less than 4, then set timeout to 4.

也就是說,定時器在巢狀層級超過5層時,最小延遲變為4ms,如下程式碼,層級一直巢狀

function cb() { f(); setTimeout(cb, 0); }
setTimeout(cb, 0);
複製程式碼
setInterval(f, 0);
複製程式碼

實際在瀏覽器的實現中,不同瀏覽器規定的巢狀層級和最小延遲都有所不同:在Chrome和Firefox中定時器的第5次呼叫被阻了,Safari是在第6次,Edge是在第3次;Chrome的Blink最小延遲是1ms

// https://chromium.googlesource.com/chromium/blink/+/master/Source/core/frame/DOMTimer.cpp
if (!(after >= 1 && after <= TIMEOUT_MAX))
  after = 1; // schedule on next tick, follows browser behavior
複製程式碼

在Node中也不一樣,沒有說巢狀層級,就是最小延遲是1ms

When delay is larger than 2147483647 or less than 1, the delay will be set to 1.

最後

歡迎關注我的微博@狂刀二

相關文章