JS中的事件循環機制(Event Loop)
1、執行機制
js 是單線程的,主線程在執行時會不斷循環往復的從同步隊列中讀取任務、執行任務,當同步隊列執行完畢后再從異步隊列中依次執行。宏任務與微任務都屬于異步任務,在執行優先級上微任務的優先級高于宏任務,因此每一次都會先執行完微任務在執行宏任務。
- 微任務有:promise的回調,MutationObserver 的回調,process.nextTick。
- 宏任務有:包括整體代碼script、定時器(setTimeout、setInterval),Dom事件,ajax事件。
微任務先于宏任務執行(除了一開始的整體代碼 script)。
1.1、執行優先級
- 同步代碼執行順序優先級高于異步代碼執行順序優先級
- process.nextTick() > Promise.then() > setTimeout > setImmediate(nodejs的方法)
(注意:process.nextTick 是 node 中的方法,而在瀏覽器中執行時(比如在vue項目中),會退化成setTimeout,所以在瀏覽器中 process.nextTick 會比 Promise.then() 慢)
1.2、總結
總得來說,在 JS 中,先是執行整體的同步任務代碼,遇到微任務就會將其放在微任務事件隊列,遇到宏任務就會放在宏任務事件隊列中。
然后整體的同步任務代碼執行完后,就會先執行微任務隊列中的任務,等待微任務隊列中的所有任務執行完畢后,此時才會從宏任務隊列中找到第一個任務進行執行。該任務執行過程中,如果遇到微任務就會放到微任務隊列中,等到該任務執行完后,就會查看微任務隊列中有沒有微任務,如果有就先執行完微隊列中的任務,否則執行第二個宏任務。以此類推。

浙公網安備 33010602011771號