首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setTimeout(有趣)和setTimeout(有趣,4)之间有什么区别吗?

setTimeout(有趣)和setTimeout(有趣,4)之间有什么区别吗?
EN

Stack Overflow用户
提问于 2014-01-10 17:04:52
回答 4查看 321关注 0票数 0

setTimeout的行为有点混乱,我所读到的所有资源都表明,当没有指定延迟时,任务会追加到队列的末尾,并在解释器没有什么可做的事情时执行(空队列?)。然而,以下面的例子为例:

代码语言:javascript
复制
setTimeout(function() { console.log('without delay!'); })
setTimeout(function () { console.log('with delay'); }, 1000);
var start = Date.now();
while (Date.now() < start + 3000) {} // block for 3 seconds
console.log('After wait');

根据上述前提,产出如下:

代码语言:javascript
复制
After wait
with delay
without delay

但是,输出(在chrome和firefox中进行了测试):

代码语言:javascript
复制
After wait
without delay
with delay

(请注意,当调用setTimeout(fn,1000)时,当解释器在经过1秒后空闲时,fn将被执行,这可能是1秒、5秒,甚至在解释器仍然繁忙的情况下也会永远执行。)

前面的例子使我推断出setTimeout(fn)setTimeout(fn,0)setTimeout(fn,4)之间没有区别(4ms是HTML5中的最小延迟),因为在经过1秒的延迟后,不加延迟的函数会在函数执行之前执行(这两个函数都可以执行)。

那么我的问题是,它们是否等价呢?(用HTML5)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-10 17:18:04

根据定时器W3规范,没有超时等于0,而0等于4

http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#dom-windowtimers-settimeout

..。 4. 获得超时时间,并让超时成为结果。 5.如果当前运行的任务是由setTimeout()方法创建的任务,且超时小于4,则将超时增加到4。

http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#get-the-timeout

当上述方法要获取超时时,它们必须运行以下步骤:

  1. 让超时值作为方法的第二个参数,如果省略了参数,则为零。
  2. 将ToString()抽象操作应用于超时值,并让超时成为结果。ECMA262
  3. 将ToNumber()抽象操作应用于超时值,并让超时成为结果。ECMA262
  4. 如果超时值是无限值,则非a-数字(NaN)值或负值,则让超时为零。
  5. 循环超时到最接近的整数,并让超时作为结果。
  6. 返回超时。
票数 1
EN

Stack Overflow用户

发布于 2014-01-10 17:29:51

你得到的和预期的完全一样。

浏览器无所事事的时刻不是根本没有超时等待的时刻,而是它目前没有运行任何东西的时刻。

在您的代码阻塞了3秒并退出代码之后,浏览器可以开始处理事件,这包括超时。由于两个超时都已过期,因此都将尽快执行,但由于第一个超时是第一个过期的,因此它将是要处理的事件队列中的第一个。

Mozilla认为,现代浏览器的最小延迟时间都是4毫秒:

4ms是由HTML5规范指定的,并且在2010年和以后发布的浏览器上是一致的

参考文献:筑巢

较旧的浏览器可能有较高的最小延迟,例如10 ms。

该标准指定超时参数的默认值为零,然后将其调整为最小延迟。

参考文献:http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#get-the-timeout

因此,在没有超时的情况下调用setTimeout,或者超时为0或4的调用都是等效的。即使在较旧的浏览器中,它们都会有相同的结果,即使最小超时更高。

票数 1
EN

Stack Overflow用户

发布于 2014-01-10 17:11:36

根据莫兹拉的说法,如果不分配延迟,每个浏览器都会设置一个最小值。因此,如果浏览器的最小值是4ms,那么0和4就意味着相同。

延迟小于“最小延迟”限制的连续setTimeout()调用被迫至少使用最小延迟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21050196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档