Javascript setTimeout函数的顺序为0,0,0,但也有0,1,0,如何设置?
我只是试着执行下面的代码Javascript setTimeout函数的顺序为0,0,0,但也有0,1,0,如何设置?,javascript,Javascript,我只是试着执行下面的代码 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(fun
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()
造成的。关于此问题的任何输入?HTML标准不要求用户代理严格按照预期等待时间对排队计时器事件进行排序,前提是所述等待时间已过。很可能第三次调用setTimeout
,返回本机代码,并从事件循环运行第一个JS回调需要1 ms以上的时间,因此在再次进入事件循环后立即运行第二个回调与运行第三个回调一样合理。一些浏览器,例如,旧版本的Internet Explorer不支持10ms以下的计时器分辨率,因此它们将1ms超时视为与0ms相同。操作系统中上下文切换的分辨率通常大于1ms(5-10ms左右除外);因此,您不能期望1ms的差异是明显的
尽管有上述规定,但就浏览器的JavaScript引擎而言,无论从历史上还是从HTML5的官方版本来看:
浏览器实现setTimeout()“钳制”:连续
setTimeout()
调用的延迟小于“最小延迟”限制
必须至少使用最小延迟。最小延迟,
DOM\u MIN\u TIMEOUT\u值为4 ms(存储在Firefox的首选项中:
dom.min\u timeout\u value
),具有5ms的dom\u CLAMP\u timeout\u嵌套级别
事实上,4ms在各个方面都是一致的
2010年及以后发布的浏览器。之前的版本(Firefox 5.0)/
Thunderbird 5.0/SeaMonkey 2.2),嵌套
超时时间为10毫秒
除了“夹紧”之外,当
页面(或操作系统/浏览器本身)正忙于其他任务
当所有计时器在同一事件期间触发时,唯一剩下的顺序是设置计时器的顺序,这导致1、2、3
。不过,有些浏览器,如Firefox,确实尊重请求延迟所隐含的隐含顺序(即使这些延迟被四舍五入到相同的值),在这些浏览器中,您将看到1,3,2
将1更改为1000。你会发现它不会按顺序进行。这是因为处理速度。我想这是因为1毫秒是一个很小的间隔,它是处理设置超时的时间。@Fietsband是的,即使我将其更改为2
,它仍然像你说的那样。1毫秒太快了,但显然2毫秒不是。我刚刚在Chrome上测试过。代码没有任何问题,只是处理时间延迟。setTimeout没有考虑创建超时所需的时间。如果此时无法启动函数,则将所有超时放在查询中,并等待引擎找到足够的cpu时间。小于4ms的延迟被视为4ms延迟。@尖锐地看铬源,它肯定显示小于4ms的超时被强制为4ms,但行为上有明显的差异(在当前的Chrome桌面中)当从JS调用时,超时时间为2或更多,而不是更短的值。这对我来说意味着还有一些其他代码在运行,尽管我在Chromium源代码中找不到。@yjo这很有趣。我发现Firefox在不久前尊重了最初请求的值,但我认为我没有检查任何其他浏览器。是的,但不是我所看到的所有浏览器it’现在正在使用兼容HTML5的浏览器。你完全没有抓住要点,这不是只在旧浏览器中才会出现的历史脚注。如果有什么区别的话,那就是现在比过去更常见了。这与你的答案所说的截然相反。