event loop它的執行順序:
-
一開始整個腳本作爲一個宏任務執行
執行過程中同步代碼直接執行,宏任務進入宏任務隊列,微任務進入微任務隊列
當前宏任務(同步代碼)執行完出隊,檢查微任務列表,有則依次執行,直到全部執行完
執行瀏覽器UI線程的渲染工作
檢查是否有Web Worker任務,有則執行
執行完本輪的宏任務,回到2,依此循環,直到宏任務和微任務隊列都爲空 -
微任務包括:MutationObserver、Promise.then()或catch()、Promise爲基礎開發的其它技術,比如fetch API、V8的垃圾回收過程、Node獨有的process.nextTick。
宏任務包括:script 、setTimeout、setInterval 、setImmediate 、I/O 、UI rendering。 -
注意⚠️:在所有任務開始的時候,由於宏任務中包括了script,所以瀏覽器會先執行一個宏任務,在這個過程中你看到的延遲任務(例如setTimeout)將被放到下一輪宏任務中來執行。
補充
第一個宏任務(同步)執行完畢,會執行微任務。微任務執行完畢,會執行第二個以至於後面的宏任務
微任務隊列只有一個
宏任務隊列有多個