2016-06-21 39 views
1

我在某些問題中看到What is minimum millisecond value of setTimeout?人們在談論「setTimeout的最小超時時間」,但我無法真正理解它。無法理解`setTimeout()中的最小超時值`

它說,在HTML5規範的最小超時值爲4ms,所以我想,如果我運行下面的瀏覽器(比如瀏覽器)代碼:

setTimeout(function() { console.log("333"); }, 3); 
setTimeout(function() { console.log("222"); }, 2); 
setTimeout(function() { console.log("111"); }, 1); 
setTimeout(function() { console.log("000"); }, 0); 

輸出應該是:

333 
222 
111 
000 

但實際上,它是:

111 
000 
222 
333 

好像他們仍然按照指定的恬運行即使它們小於4(期望01

我應該如何理解值4ms

+0

'4ms'可能會更好地理解爲'250fps'。有點高,你不覺得嗎? –

+2

我覺得你必須閱讀[__'Event loop'__](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop#Event_loop) – Rayon

+2

而[___'延遲超過指定的原因' ___](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout#Reasons_for_delays_longer_than_specified) – Rayon

回答

1

4毫秒的限制由HTML5規範指定,並且在2010年及以後發佈的瀏覽器中保持一致。

http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers

要實現0毫秒在現代瀏覽器超時,您可以使用window.postMessage()

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

更多信息

https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout

https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop#Event_loop

+0

好的,那麼你對OP代碼發生了什麼的解釋是什麼? – nnnnnn

+0

這將取決於JS引擎的實現......這意味着您可能在其他瀏覽器中獲得不同的結果。我建議你使用[console.time](https://developer.mozilla.org/en-US/docs/Web/API/Console/time)來更好地理解那些時間延遲。一種可能的解釋是,JS引擎可以將額外的參數傳遞給回調例程,以毫秒爲單位指示超時的「實際滯後」。 – rafaelcastrocouto

1

閱讀推薦的文章後(感謝@Rayon和@rafaelcastrocouto),也這一個:

http://www.adequatelygood.com/Minimum-Timer-Intervals-in-JavaScript.html

我意識到也許我誤解了「最小」的延遲值的含義。

setTimeout指定的超時有兩個含義:

  1. 的函數會在或指定的超時(之前不是)後
  2. 順序由指定的超時的值來決定的,該小較早(在某些平臺上,0被認爲是一樣的1),和第一所添加的早期,如果他們有相同的超時

我們不需要關注日e「最小」延遲值(例如, 4ms)。

然後這些任務將由Javascript運行時執行。運行時將逐個從事件隊列中取出任務(同時檢查超時是否正確),然後執行它們。但是對於一些性能問題,運行時無法在前一個任務完成後立即運行下一個任務,可能會有一個小小的延遲(根據不同的運行時實現),並且在HTML5規範中,延遲應該大於等於4ms(在早期瀏覽器中爲10ms)

+0

我確實學到了更多與你的問題/答案...格拉茨! – rafaelcastrocouto

+0

@rafaelcastrocouto很高興聽到:) – Freewind