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