在了解EventLoop之前,我們需要知道什么
- javaScript是單線程。
- javaScript任務可以分為同步任務和異步任務
作為一個單線程語言,執(zhí)行同步任務,自然是沒有問題,那么,他又是如何執(zhí)行異步任務的呢?這里就用到了我們要說的EventLoop。
什么是EventLoop
EventLoop又稱事件循環(huán)機制,是瀏覽器或者Node為了防止JavaScript在單線程在單線程運行時發(fā)生阻塞的一種事件機制。
javaScript任務隊列
想要了解EventLoop究竟是如何工作的,我們首先還要了解javaScript的事件隊列。
我們可以理解為我們的代碼是一個任務隊列,他由同步任務和異步任務構成,
因為javaScript單線程的特點,所以所有的任務只能一個一個執(zhí)行,前一個任務結束,后一個任務開始,這就是我們前面說到的同步任務,當然還有另外一種任務,比如后端的數(shù)據(jù)請求,如果數(shù)據(jù)量大,后端返回運行的邏輯復雜,就會導致數(shù)據(jù)返回的很慢,這樣一來,如果后面的任務一直等著,就會造成任務的阻塞,所以我們需要將返回慢的暫時掛起,然后先執(zhí)行后面的事件,這也就是我們上面說的異步任務。
微任務與宏任務
這是EventLoop的重點,宏任務與微任務:
宏任務(MacroTask,也成Task):script(整體代碼)、setTimeout、setInterval、I\O、UI交互事件、postMessageChannel、setImmediate
微任務(MircoTask):Promise.then、Object.observe、MutaionObserver、process.nextTick
他們的簡單執(zhí)行過程:
先執(zhí)行一個宏任務,然后如果遇到微任務就把微任務放到微任務列表中,然后等宏任務執(zhí)行完成,執(zhí)行所有微任務,當微任務全部執(zhí)行完成之后可以視為當前宏任務已經執(zhí)行完成,然后進行瀏覽器渲染,渲染完成后開啟下一個宏任務。