setTimeout延時0毫秒的作用
遇到問題
我們在面試中經(jīng)常遇到面試官會考這樣一段代碼:
console.log(1);
setTimeout(function() {
console.log(2);
}, 0);
console.log(3);
打印出的結(jié)果應(yīng)該依次是: 1 3 2. why?
簡單點可以這么說: js是單線程的疾渴,是基于事件循環(huán)的菠净。setTimeout函數(shù)是異步的遏暴,異步的事件會加入一個隊列要门,當(dāng)同步的任務(wù)執(zhí)行完之后缀去,才會執(zhí)行履恩。
解釋
在 Why is setTimeout(fn, 0) sometimes useful? 這個問題中有更詳細(xì)的解讀,贊數(shù)最高的回答指出:js運行的時候倔既,可能瀏覽器會渲染界面恕曲,構(gòu)建元素,代碼看起來也許像是同步執(zhí)行渤涌,然而有可能渲染的速度更不上佩谣,這時候我們需要將它(js的同步代碼)放入異步隊列當(dāng)中,等待dom渲染操作完成之后再執(zhí)行实蓬,這就是
setTimeout()
的作用茸俭。-
在 http://www.cnblogs.com/silin6/p/4333999.html 有比較詳細(xì)的說明,
瀏覽器中有三個引擎安皱,js引擎和GUI引擎和js的事件引擎. 而重要的一點是:js引擎和GUI引擎互斥调鬓,有時候要想在操作DOM的情況下正確運行js,需要等待渲染完畢,, 按《深入淺出Node.js》第48頁(如下圖)所說练俐,瀏覽器中js和UI渲染共用一個線程袖迎,有時js想得到期望的結(jié)果冕臭,需要等待UI渲染完畢腺晾。所以setTimeout(()=>{},0);
還是很有用的。
類似問題
Process.nextTick 和 setImmediate 的區(qū)別辜贵? 這個問題中的這張圖很形象的說明了問題悯蝉。 setTimeout(()=>{},0);
也會和第二張圖類似。