<script type="text/javascript">
console.log(1);
setTimeout(function(){
console.log(2);
},0);
console.log(3);
</script>
複製代碼
相信你們,都知道,這道題的輸出結果是javascript
1java
3瀏覽器
2bash
這道題引出了以下的知識點:
js的單線程是什麼?異步
js在一個時間內,只能作一件事情。
什麼是任務隊列?函數
任務隊列分爲同步任務和異步任務。例如:console.log()這樣的語句屬於同步任務,setInterval()/setTimeout()這樣的語句屬於異步任務。
什麼是Event Loop?oop
在js單線程的運行機制中,會優先執行同步任務,當遇到setInterval()/setTimeout()這樣的異步任務時, js引擎不會把它們放在運行棧中執行,而是瀏覽器的timer模塊會把它們拿走,時間到了(指定時器函數的時間),timer模塊會把它們放到異步隊列中,js引擎發現運行棧中沒有要執行的代碼了,就會去讀取異步隊列中的內容,放到運行棧中去執行,這時setTimeout()/setInterval()函數體中的內容,就在成爲了運行棧中的同步任務了,執行完後,再會去監聽異步隊列中是否有內容,若是有繼續執行,如此反覆,這個循環的過程就是Event Loop。