问题描述
已经有一段时间了,因为自2011年,2012年以来一直没有提出这样的话题。 现在,这段代码
setTimeout(()=>{ console.log(1); },1);
setTimeout(()=>{ console.log(2); },0);
setTimeout(()=>{ console.log(3); },2);
将打印 1-2-3 ,即使您希望2记录得比1更快。
您可以通过指出“所有小于4毫秒的超时将延迟到4毫秒”来解释。
或者说大约13毫秒的滴答,例如-在执行第二行时,第一行已清除时间并记录下来,但是不行,如果我们使用2-3毫秒时间,则这两个规则都将不适用。在这种情况下,一切都按预期运行
证明:
setTimeout(()=>{ console.log(1); },3);
setTimeout(()=>{ console.log(2); },2);
setTimeout(()=>{ console.log(3); },2);
不会应用该规则-按照ms顺序指示,2将在1之前记录。
Chrome 84中遇到此问题。 Firefox会按顺序执行所有这些代码,无论那里有多少毫秒。 1-2或3-2或6-5等 原来Chrome的1ms和0ms是相同的,而5-6或2-3是不同的 PS:Opera的行为也像Chrome。 1ms与0相同,而2ms则不同于1ms
为什么?
解决方法
因为在排队的代码块被调用的时间过去了1ms。看到第一个在队列的最前面,并且超时时间已过,它将被执行。