Javascript 为什么setTimeout(fn,0)和setTimeout(fn,1)是相同的,而sT(fn,5)/sT(fn,6)是不同的?

Javascript 为什么setTimeout(fn,0)和setTimeout(fn,1)是相同的,而sT(fn,5)/sT(fn,6)是不同的?,javascript,google-chrome,firefox,settimeout,Javascript,Google Chrome,Firefox,Settimeout,这已经有一段时间了,因为自20112012年以来就没有提出过这样的话题。 现在,这个代码 setTimeout(()=>{console.log(1);},1); setTimeout(()=>{console.log(2);},0); setTimeout(()=>{console.log(3);},2); 将打印1-2-3,即使您希望2的记录速度比1快 您可以通过指出“所有小于4ms的超时将延迟到4ms”来解释这一点 或者说大约13毫秒,比如-当第二行被执行时,第一行已经清除了时间并被记

这已经有一段时间了,因为自20112012年以来就没有提出过这样的话题。 现在,这个代码


setTimeout(()=>{console.log(1);},1);
setTimeout(()=>{console.log(2);},0);
setTimeout(()=>{console.log(3);},2);
将打印1-2-3,即使您希望2的记录速度比1快

您可以通过指出“所有小于4ms的超时将延迟到4ms”来解释这一点

或者说大约13毫秒,比如-当第二行被执行时,第一行已经清除了时间并被记录,但是不,如果我们使用2-3毫秒的时间,这两条规则都不适用。在这种情况下,一切都按预期进行

证明:

setTimeout(()=>{console.log(1);},3);
setTimeout(()=>{console.log(2);},2);
setTimeout(()=>{console.log(3);},2);
不会应用该规则-2在1之前被记录,如ms order所示

在Chrome 84中满足此行为。 Firefox正在按顺序执行所有这些代码,不管有什么ms。1-2或3-2或6-5等 结果表明,铬的1ms和0ms是相同的,而5-6或2-3是不同的 PS:Opera的行为也类似于Chrome。处理1ms与0相同,而2ms不同于1ms


为什么?

因为调用排队的代码块的时间已经过了1ms。如果第一个参数位于队列前面,并且超时时间已过,则将执行该设置。

无法保证何时执行设置超时,除非设置超时后的n(第二个参数)毫秒内不会运行。因为它们具有不同的JavaScript引擎,你的耽搁时间太短了relevant@MisterJojo为什么我的短暂延迟与Firefox有关?不,thety不相关,即使是Firefox,事实上,我有一个想法。首先,当然浏览器引擎是不同的,Firefox以其他方式处理这些代码,从而产生预期的结果。至于“为什么1被视为0而2与1不同”,我建议如下。可能1毫秒不足以让浏览器解析和执行所有代码,并且在解析第2行之前清除并运行1毫秒的时间会导致console.log(1)在该console.log(2)上执行,而所有其他示例(2毫秒及以上)都足以以正确的顺序解析/执行所有代码。