JS Event Loop
阿新 • • 發佈:2020-12-24
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程式碼
因此:可以直接理解為優先順序:呼叫棧>微任務>訊息佇列