摘要:事件循環(huán)的順序,決定代碼執(zhí)行的順序。輸出第二輪事件循環(huán)正式結(jié)束三第三輪事件循環(huán)第三輪事件循環(huán)從宏任務(wù)開始。記為遇到,立即執(zhí)行回調(diào)函數(shù)放入中注冊,然后被分發(fā)到微任務(wù)事件隊列中。
1、為什么要有事件循環(huán)?
因為js是單線程的,事件循環(huán)是js的執(zhí)行機(jī)制,也是js實現(xiàn)異步的一種方法。
既然js是單線程,那就像只有一個窗口的銀行,客戶需要排隊一個一個辦理業(yè)務(wù),同理js任務(wù)也要一個一個順序執(zhí)行。如果一個任務(wù)耗時
過長,那么后一個任務(wù)也必須等著。那么問題來了,假如我們想瀏覽新聞,但是新聞包含的超清圖片加載很慢,難道我們的網(wǎng)頁要一直卡著
直到圖片完全顯示出來?因此聰明的程序員將任務(wù)分為兩類:
同步任務(wù)
異步任務(wù)
當(dāng)我們打開網(wǎng)站時,網(wǎng)頁的渲染過程就是一大堆同步任務(wù),比如頁面骨架和頁面元素的渲染。而像加載圖片音樂之類占用資源大耗時久的任務(wù),
就是異步任務(wù)。
JavaScript中除了廣泛的同步任務(wù)和異步任務(wù),我們對任務(wù)有更精細(xì)的定義:
macro-task(宏任務(wù)): 包括整體代碼script,setTimeout,setInterval
micro-task(微任務(wù)): Promise,process.nextTick
不同的類型的任務(wù)會進(jìn)入不同的Event Queue(事件隊列),比如setTimeout、setInterval會進(jìn)入一個事件隊列,而Promise會進(jìn)入
另一個事件隊列。
一次事件循環(huán)中有宏任務(wù)隊列和微任務(wù)隊列。事件循環(huán)的順序,決定js代碼執(zhí)行的順序。進(jìn)入整體代碼(宏任務(wù)-3、分析更復(fù)雜的代碼 一、第一輪事件循環(huán)
a)、整段