1. 程式人生 > 實用技巧 >JS Event Loop

JS Event Loop

JS是一門單執行緒的語言,它的非同步和多執行緒的實現是通過Event Loop事件迴圈機制實現的。

大致由三個部分組成:

  • 呼叫棧(call stack)
  • 訊息佇列(Message Queue)
  • 微任務佇列(Microtask Queue)

過程:

  • Event Loop開始時,從全域性開始一行一行執行,遇到函式呼叫將其壓入棧中。被壓入的函式叫做幀(Frame)。然後依次按照函式呼叫順序入棧出棧。當所有棧中函式執行結束,呼叫棧清空
  • 非同步操作:如fetch、事件回撥、settimeout的回撥函式會進入訊息佇列中稱為訊息。訊息會在呼叫棧清空的時候執行
  • 使用Promise、Async/await建立的非同步操作會進入微任務佇列 中,它會在調用棧被清空的時候立即執行。
    並且處理期間新加入的微任務也會立即執行

一個舉例,包含呼叫棧、訊息佇列、微任務佇列:

        var p = new Promise(resolve => {
            console.log(4);     //① 呼叫棧0——4
            resolve(5) 
        })

        function fn1() {
            console.log(1);
        }

        function fn2() {
            setTimeout(() => {
                console.log(
2); //⑥ 訊息佇列0——2 }) fn1(); // ② 呼叫棧1——1 console.log(3); //③ 呼叫棧2——3 p.then(resolve => { console.log(resolve); //④ 微任務0——5 }).then(() => { console.log(6); //⑤ 微任務1——6 }) } fn2()
// 4 1 3 5 6 2

列印結果:

說明:

  • 正常執行的①②③步首先處於呼叫棧中。執行結束以後。
  • 開始依次執行微任務佇列中的④⑤兩步
  • 等呼叫棧和微任務佇列中的所有執行結束,開始執行訊息佇列⑥中的JS程式碼

因此:可以直接理解為優先順序:呼叫棧>微任務>訊息佇列