一道題引出的Event Loop

lixinfang101發表於2018-02-04
<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。

相關文章