JavaScript是單線程祈搜。
單線程原因
- 為了避免復雜性,瀏覽器腳本語言的優(yōu)勢
作為瀏覽器腳本語言士八,JavaScript的主要用途是與用戶互動容燕,以及操作DOM,假如使用多線程在同一時間點對DOM進行增刪操作婚度,瀏覽器無法分辨以哪個進程為準蘸秘。
為什么有同步任務與異步任務之分
提高GPU的利用效率
js任務執(zhí)行
js中的同步任務會在主線程按照順序執(zhí)行,異步任務會進入任務隊列蝗茁,在主線程會形成一個執(zhí)行棧醋虏,主線程中的任務執(zhí)行完畢后,會在任務隊列中去查看事件哮翘,將異步任務放入執(zhí)行棧颈嚼,開始執(zhí)行。
事件循環(huán)EventLoop
主線程從任務隊列中讀取事件饭寺,這個過程是不斷循環(huán)的阻课,因此這個運行機制稱為Event Loop
異步任務又分為宏任務(macrotask)和微任務(microtask)叫挟,那么任務隊列就有了宏任務隊列和微任務隊列,微任務總是在宏任務之前執(zhí)行限煞,也就是說:同步任務>微任務>宏任務抹恳,
js代碼執(zhí)行流程
總結(jié)
- 宏隊列macrotask一次只從隊列中取一個任務執(zhí)行,執(zhí)行完后就去執(zhí)行微任務隊列中的任務署驻;
- 微任務隊列中所有的任務都會被依次取出來執(zhí)行奋献,知道m(xù)icrotask queue為空;
- 圖中沒有畫UI rendering的節(jié)點旺上,因為這個是由瀏覽器自行判斷決定的瓶蚂,但是只要執(zhí)行UI rendering,它的節(jié)點是在執(zhí)行完所有的microtask之后宣吱,下一個macrotask之前扬跋,緊跟著執(zhí)行UI render。