我細讀了一套在線的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-工作/) –