我刚尝试执行以下代码
setTimeout(function(){ console.log(1); }, 0);
setTimeout(function(){ console.log(2); }, 0);
setTimeout(function(){ console.log(3); }, 0);
以上代码依次记录1,2,3。但如果我用秒值0,1,1
做同样的事情setTimeout(function(){ console.log(1); }, 0);
setTimeout(function(){ console.log(2); }, 1);
setTimeout(function(){ console.log(3); }, 0);
上面的代码依次记录相同的1,2,3。在Chrome中测试过这个!
想知道这是否因console.log()
而发生。对此有任何意见吗?
答案 0 :(得分:2)
当所述等待时间已经过去时,HTML标准不要求用户代理严格按照预期的等待时间对排队的定时器事件进行排序。很可能第三次调用setTimeout
,返回本机代码,并从事件循环运行第一个JS回调需要1 ms以上,因此在重新进入事件循环后立即运行第二个回调和运行第三个一样合乎逻辑。
答案 1 :(得分:0)
操作系统中上下文切换的分辨率通常大于1ms(预计5-10ms左右);因此,你不能指望1毫秒的差异是显而易见的。
尽管如此,就浏览器的JavaScript引擎而言,从历史角度讲,现在正式为HTML5,any difference below 4ms is likely to be ignored无论如何:
Historically浏览器实现setTimeout()“clamp”:连续
setTimeout()
来电延迟小于“最小延迟”限制 被迫至少使用最小延迟。最小延迟,DOM_MIN_TIMEOUT_VALUE
,为4毫秒(存储在Firefox的首选项中:dom.min_timeout_value
),DOM_CLAMP_TIMEOUT_NESTING_LEVEL
为5毫秒。事实上,4ms是specified by the HTML5 spec并且是一致的 浏览器于2010年及之后发布。之前(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2),嵌套的最小超时值 超时是10毫秒。
除了“钳制”之外,超时也可以在以后开火 页面(或OS /浏览器本身)正忙于其他任务。
如果所有计时器在同一事件中被触发,那么,唯一剩下的顺序是设置计时器的顺序,结果为1, 2, 3
。但是,某些浏览器(如Firefox)确实遵守请求延迟所暗示的隐式排序(即使这些延迟被四舍五入到相同的值),并且在这些浏览器中,您将看到1, 3, 2
。
答案 2 :(得分:-1)
某些浏览器,例如旧版本的Internet Explorer不支持10ms以下的定时器分辨率,因此它们会将1ms超时视为0ms。