我细读了一套在线的JavaScript的面试问题,发现以下问题:理解的setTimeout为了
function printing() {
console.log(1);
setTimeout(function() { console.log(2); }, 1);
setTimeout(function() { console.log(3); }, 2);
setTimeout(function() { console.log(4); }, 0);
console.log(5);
}
printing();
我期待下面的代码以下内容打印到控制台:1,5,4,3 ,2 我的理由是console.log(1)和console.log(2)首先被执行,而setTimeout被发送到eventloop,并等待所有事情先完成。一旦打印出5,JS就会查看队列,并且4,3,2会在下一个按下/弹出。
但是,在我的Chrome浏览器中,我注意到1,5,2,4,3代替。
我很困惑,但同时有一个预感,它可能是由于超时延迟的小增量导致打嗝(也许是浏览器的事?)。我之所以这样做,是因为我为每个数字添加了两个零以便延迟变为100,200和0。
任何人都可以澄清引擎盖下发生了什么,以及任何我应该了解延迟的细节?
很确定超时的最小有效值是1,所以0移到1,因此发生在之后。不确定。无论如何,我不会使用小于16ms的定时器(60Hz),因为这是Windows的默认定时器分辨率,我不想仅仅为了使用高分辨率定时器。 –
我注意到下面的链接,其中最小值为4ms和10ms取决于浏览器:http://stackoverflow.com/questions/9647215/what-is-minimum-millisecond-value-of-settimeout – bigbitecode
这可能是值得注意的是,在[w3 spec](http://www.w3.org/TR/html5/webappapis.html)第6.4节规定'... timeout小于4,然后增加超时到4'(如果你的ms值是根据规范0-3它将被设置为4),并且与此同时,您可能会发现以下有关Javascript计时的有用信息[Javascript Javascript定时器如何工作](http://ejohn.org/blog/how-javascript-timers-工作/) –