巨集任務和微任務

Cosalneo發表於2020-11-13

事件迴圈:

  • 同步和非同步任務分別進入不同的執行"場所",同步的進入主執行緒,非同步的進入Event Table並註冊函式
  • 當指定的事情完成時,Event Table會將這個函式移入Event Queue
  • 主執行緒內的任務執行完畢為空,會去Event Queue讀取對應的函式,進入主執行緒執行
    事件迴圈
console.log(1);
setTimeout(() => {
    console.log(2);
}, 0);
console.log(3);
// 1 3 2

巨集任務和微任務

不同的非同步事件,會進入不同的Event Queue,進一步把非同步事件劃分為巨集任務和微任務

  • 巨集任務主要有:setTimeout、setInterval、I/O、script程式碼塊等
  • 微任務的主要有:nextTick、callback、Promise、process.nextTick等

執行順序
進入整體程式碼(巨集任務)後,開始第一次迴圈。接著執行所有的微任務。然後再次從巨集任務開始,找到其中一個任務佇列執行完畢,再執行所有的微任務。

例子1:在同一個按鈕上繫結兩個點選事件,使用者點選按鈕,輸出的順序是什麼?

	button.addEventListener('click',() => {
	    Promise.resolve().then(() => console.log('Promise 1'))
	    console.log('Listener 1')
	})
	
	button.addEventListener('click',() => {
	    Promise.resolve().then(() => console.log('Promise 2'))
	    console.log('Listener 2')
	})
	
	// button.click()    // 如果使用js程式碼執行點選事件,輸出結果會有變化嗎
	
	輸出結果是
	
	Listener 1   Promise 1   Listener 2   Promise 2

參考:
https://juejin.im/post/6844904198581010439#heading-13

相關文章