为什么setTimeoutfn,0和setTimeoutfn,1相同而sTfn,5/ sTfn,6不相同?

问题描述

已经有一段时间了,因为自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。看到第一个在队列的最前面,并且超时时间已过,它将被执行。