因為 js 是單線程運行的,在代碼執行時,通過將不同函數的執行上下文壓入執行棧中來保證代碼的有序執行。在執行同步代碼時,如果遇到異步事件,js 引擎并不會一直等待其返回結果,而是會將這個事件掛起,繼續執行執行棧中的其他任務。當異步事件執行完畢后,再將異步事件對應的回調加入到一個任務隊列中等待執行。任務隊列可以分為宏任務隊列和微任務隊列,當當前執行棧中的事件執行完畢后,js 引擎首先會判斷微任務隊列中是否有任務可以執行,如果有就將微任務隊首的事件壓入棧中執行。當微任務隊列中的任務都執行完成后再去執行宏任務隊列中的任務。
Event Loop 執行順序如下所示:首先執行同步代碼,這屬于宏任務當執行完所有同步代碼后,執行棧為空,查詢是否有異步代碼需要執行執行所有微任務當執行完所有微任務后,如有必要會渲染頁面然后開始下一輪 Event Loop,執行宏任務中的異步代碼