摘要:即任務(wù)執(zhí)行完畢,接著執(zhí)行完所有的任務(wù)后,此時本輪循環(huán)結(jié)束,開始執(zhí)行。完畢之后接著下一輪循環(huán)。來道經(jīng)典題目答案是先走完所有同步代碼到微任務(wù)宏任務(wù)
前言
眾所周知,js是單線程的,就像我們不能一邊刷牙一邊洗臉(或許有些大佬真的可以),那么單線程如何才能規(guī)劃調(diào)度好要做的任務(wù)呢?
這個時候就要介紹一下這個任務(wù)機制了~
宏任務(wù)
微任務(wù)
注意:瀏覽器環(huán)境和node環(huán)境是不一樣的,本文只討論瀏覽器環(huán)境
規(guī)則執(zhí)行一個宏任務(wù)(先執(zhí)行同步代碼)-->執(zhí)行所有微任務(wù)-->UI render-->執(zhí)行下一個宏任務(wù)-->執(zhí)行所有微任務(wù)-->UI render-->
根據(jù)HTML Standard,一輪事件循環(huán)執(zhí)行結(jié)束之后,下輪事件循環(huán)執(zhí)行之前開始進行UI render。即:macro-task任務(wù)執(zhí)行完畢,接著執(zhí)行完所有的micro-task任務(wù)后,此時本輪循環(huán)結(jié)束,開始執(zhí)行UI render。UI render完畢之后接著下一輪循環(huán)。但是UI render不一定會執(zhí)行,因為需要考慮ui渲染消耗的性能已經(jīng)有沒有ui變動
需要注意的是,微任務(wù)是有優(yōu)先級的,就如同上面的表格從上往下一樣,nextTick>Promise>MutationObserver.
那么宏任務(wù)有沒有優(yōu)先級呢??
大部分瀏覽器會把DOM事件回調(diào)優(yōu)先處理 因為要提升用戶體驗 給用戶反饋,其次是network IO操作的回調(diào),再然后是UIrender,之后的順序就難以捉摸了,其實不同瀏覽器的表現(xiàn)也不太一樣,這里不做過多討論。
來道經(jīng)典題目console.log("script start"); setTimeout(function() { console.log("setTimeout"); }, 0); Promise.resolve().then(function() { console.log("promise1"); }).then(function() { console.log("promise2"); }); console.log("script end");
答案是
"script start"、"script end"、"promise1"、"promise2"、"setTimeout"
先走完所有同步代碼-到promise微任務(wù)-宏任務(wù)setTimeout
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101710.html
摘要:如果沒到毫秒,那么階段就會跳過,進入階段,先執(zhí)行的回調(diào)函數(shù)。參考文檔什么是瀏覽器的事件循環(huán)不要混淆和瀏覽器中的定時器詳解瀏覽器和不同的事件循環(huán)深入理解事件循環(huán)機制篇中的執(zhí)行機制 最近對Event loop比較感興趣,所以了解了一下。但是發(fā)現(xiàn)整個Event loop盡管有很多篇文章,但是沒有一篇可以看完就對它所有內(nèi)容都了解的文章。大部分的文章都只闡述了瀏覽器或者Node二者之一,沒有對比...
摘要:當多個事件觸發(fā)的時候,會把異步事件依次的放入里等同步事件執(zhí)行完之后,再去隊列里一個個執(zhí)行拾遺常用方法總結(jié)面試的信心來源于過硬的基礎(chǔ)參考高級程序設(shè)計你所不知道的深入淺出知識點思維導(dǎo)圖經(jīng)典實例總結(jié)那些剪不斷理還亂的關(guān)系 持續(xù)不斷更新。。。 基本類型和引用類型 vue props | Primitive vs Reference Types 基本類型和字面值之間的區(qū)別 基本類型和字面值相等,...
摘要:瀏覽器是多進程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機制的文章深入前端徹底搞懂瀏覽器運行機制瀏覽器每打開一個標簽頁,就相當于創(chuàng)建了一個獨立的瀏覽器進程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運行機制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個總結(jié),參考文章鏈接見最后。本文博客地址 了解進程和線程 進程是應(yīng)用...
摘要:瀏覽器是多進程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機制的文章深入前端徹底搞懂瀏覽器運行機制瀏覽器每打開一個標簽頁,就相當于創(chuàng)建了一個獨立的瀏覽器進程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運行機制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個總結(jié),參考文章鏈接見最后。本文博客地址 了解進程和線程 進程是應(yīng)用...
摘要:前端基礎(chǔ)進階正是圍繞這條線索慢慢展開,而事件循環(huán)機制,則是這條線索的最關(guān)鍵的知識點。特別是中正式加入了對象之后,對于新標準中事件循環(huán)機制的理解就變得更加重要。之后全局上下文進入函數(shù)調(diào)用棧。 showImg(https://segmentfault.com/img/remote/1460000008811705); JavaScript的學(xué)習(xí)零散而龐雜,因此很多時候我們學(xué)到了一些東西,但...
閱讀 2408·2021-11-23 09:51
閱讀 1219·2021-11-22 13:54
閱讀 3428·2021-09-24 10:31
閱讀 1095·2021-08-16 10:46
閱讀 3629·2019-08-30 15:54
閱讀 710·2019-08-30 15:54
閱讀 2892·2019-08-29 17:17
閱讀 3163·2019-08-29 15:08