2016-06-21 22 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