setTimeout的行为有点混乱,我所读到的所有资源都表明,当没有指定延迟时,任务会追加到队列的末尾,并在解释器没有什么可做的事情时执行(空队列?)。然而,以下面的例子为例:
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');根据上述前提,产出如下:
After wait
with delay
without delay但是,输出(在chrome和firefox中进行了测试):
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)。
发布于 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
当上述方法要获取超时时,它们必须运行以下步骤:
发布于 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的调用都是等效的。即使在较旧的浏览器中,它们都会有相同的结果,即使最小超时更高。
发布于 2014-01-10 17:11:36
根据莫兹拉的说法,如果不分配延迟,每个浏览器都会设置一个最小值。因此,如果浏览器的最小值是4ms,那么0和4就意味着相同。
延迟小于“最小延迟”限制的连续setTimeout()调用被迫至少使用最小延迟。
https://stackoverflow.com/questions/21050196
复制相似问题