聊聊js的異步
首先,聊異步,得先弄清楚為什么不用同步,用同步會有什么問題,我們先明確一點,js的執(zhí)行是單線程的,因為它是運行在瀏覽器渲染主線程中的,而渲染主線程只有一個。
如果同步的話,那么來一個計時器就得等多少秒才能執(zhí)行任務(wù),然后才能去執(zhí)行后面的代碼,非常浪費時間,而且渲染主線程不僅僅是用來執(zhí)行js的,還有很多其他的工作要做,比如解析html,css,計算樣式,布局,處理圖層,頁面每秒刷新60次等等.....
如果說使用同步的話,這些任務(wù)都得卡在那里,就會給用戶一種卡死的感覺,體驗很不好。
所以需要采用異步的方式處理js代碼。那么具體又是怎么操作的呢?這就涉及到了事件循環(huán)了。
闡述一下js的事件循環(huán)?
事件循環(huán)又叫消息循環(huán),是瀏覽器渲染主線程的工作方式
過去把消息隊列簡單的分為宏任務(wù)和微任務(wù)隊列兩種,但是這種說法已經(jīng)無法滿足這么復(fù)雜的瀏覽器環(huán)境,取而代之的是另一種更加靈活多變的處理方式
根據(jù)W3C官方的解釋,每個任務(wù)有不同的類型,同類型的任務(wù)必須在同一個隊列,不同類型的任務(wù)可以屬于不同的隊列,不同任務(wù)隊列有不同的優(yōu)先級,在一次事件循環(huán)中,由瀏覽器自己決定去取哪一個隊列的任務(wù)去執(zhí)行,但是呢,瀏覽器必須要有一個微任務(wù)隊列,并且該隊列的優(yōu)先級是最高的,必須最先調(diào)度執(zhí)行
事件循環(huán)是異步的實現(xiàn)方式
單線程是異步產(chǎn)生的原因