JavaScript執(zhí)行-宏任務(wù)與微任務(wù)

JavaScript是在JavaScript 引擎中執(zhí)行的,當(dāng)拿到一段 JavaScript 代碼時苗分,瀏覽器或者 Node 環(huán)境首先要做的就是;傳遞給 JavaScript 引擎谆奥,并且要求它去執(zhí)行。
然而嚷掠,執(zhí)行 JavaScript 并非一錘子買賣,宿主環(huán)境當(dāng)遇到一些事件時荞驴,會繼續(xù)把一段代碼傳遞給 JavaScript 引擎去執(zhí)行不皆,此外,我們可能還會提供 API 給 JavaScript 引擎熊楼,比如 setTimeout 這樣的 API霹娄,它會允許 JavaScript 在特定的時機(jī)執(zhí)行。所以鲫骗,我們首先應(yīng)該形成一個感性的認(rèn)知:一個 JavaScript 引擎會常駐于內(nèi)存中犬耻,它等待著我們(宿主)把 JavaScript 代碼或者函數(shù)傳遞給它執(zhí)行。在 ES3 和更早的版本中执泰,JavaScript 本身還沒有異步執(zhí)行代碼的能力枕磁,這也就意味著,宿主環(huán)境傳遞給 JavaScript 引擎一段代碼术吝,引擎就把代碼直接順次執(zhí)行了计济,這個任務(wù)也就是宿主發(fā)起的任務(wù)。但是排苍,在 ES5 之后沦寂,JavaScript 引入了 Promise,這樣淘衙,不需要瀏覽器的安排传藏,JavaScript 引擎本身也可以發(fā)起任務(wù)了。
我們把宿主發(fā)起的任務(wù)稱為宏觀任務(wù)幔翰,把 JavaScript 引擎發(fā)起的任務(wù)稱為微觀任務(wù)

宏觀和微觀任務(wù)JavaScript 引擎等待宿主環(huán)境分配宏觀任務(wù)漩氨,在操作系統(tǒng)中西壮,通常等待的行為都是一個事件循環(huán)遗增,所以在 Node 術(shù)語中,也會把這個部分稱為事件循環(huán)款青。不過做修,術(shù)語本身并非我們需要重點討論的內(nèi)容,我們在這里把重點放在事件循環(huán)的原理上抡草。在底層的 C/C++ 代碼中饰及,這個事件循環(huán)是一個跑在獨立線程中的循環(huán),我們用偽代碼來表示康震,大概是這樣的:while(TRUE) { r = wait(); execute(r);}我們可以看到燎含,整個循環(huán)做的事情基本上就是反復(fù)“等待 - 執(zhí)行”。當(dāng)然腿短,實際的代碼中并沒有這么簡單屏箍,還有要判斷循環(huán)是否結(jié)束绘梦、宏觀任務(wù)隊列等邏輯,這里為了方便你理解赴魁,我就把這些都省略掉了卸奉。這里每次的執(zhí)行過程,其實都是一個宏觀任務(wù)颖御。我們可以大概理解:宏觀任務(wù)的隊列就相當(dāng)于事件循環(huán)榄棵。在宏觀任務(wù)中,JavaScript 的 Promise 還會產(chǎn)生異步代碼潘拱,JavaScript 必須保證這些異步代碼在一個宏觀任務(wù)中完成疹鳄,因此,每個宏觀任務(wù)中又包含了一個微觀任務(wù)隊列泽铛。

js執(zhí)行過程

是通過的事件循環(huán)(event loop),理解了event loop機(jī)制,就理解了JS的執(zhí)行機(jī)制尚辑。
同步和異步任務(wù)分別進(jìn)入不同的執(zhí)行"場所",同步的進(jìn)入主線程盔腔,異步的進(jìn)入Event Table并注冊函數(shù)杠茬。
當(dāng)指定的事情完成時,Event Table會將這個函數(shù)移入Event Queue弛随。
主線程內(nèi)的任務(wù)執(zhí)行完畢為空瓢喉,會去Event Queue讀取對應(yīng)的函數(shù),進(jìn)入主線程執(zhí)行舀透。
上述過程會不斷重復(fù)栓票,也就是常說的Event Loop(事件循環(huán))。

我們不禁要問了愕够,那怎么知道主線程執(zhí)行棧為空白咛啊?js引擎存在monitoring process進(jìn)程惑芭,會持續(xù)不斷的檢查主線程執(zhí)行棧是否為空坠狡,一旦為空,就會去Event Queue那里檢查是否有等待被調(diào)用的函數(shù)遂跟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逃沿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幻锁,更是在濱河造成了極大的恐慌凯亮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哄尔,死亡現(xiàn)場離奇詭異假消,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)岭接,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門富拗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堂鲤,“玉大人,你說我怎么就攤上這事媒峡∥疗埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵谅阿,是天一觀的道長半哟。 經(jīng)常有香客問我,道長签餐,這世上最難降的妖魔是什么寓涨? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮氯檐,結(jié)果婚禮上戒良,老公的妹妹穿的比我還像新娘。我一直安慰自己冠摄,他們只是感情好糯崎,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著河泳,像睡著了一般沃呢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拆挥,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天薄霜,我揣著相機(jī)與錄音,去河邊找鬼纸兔。 笑死惰瓜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汉矿。 我是一名探鬼主播崎坊,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼负甸!你這毒婦竟也來了流强?” 一聲冷哼從身側(cè)響起痹届,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤呻待,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后队腐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕捉,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年柴淘,在試婚紗的時候發(fā)現(xiàn)自己被綠了迫淹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘通。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敛熬,靈堂內(nèi)的尸體忽然破棺而出肺稀,到底是詐尸還是另有隱情,我是刑警寧澤应民,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布话原,位于F島的核電站,受9級特大地震影響诲锹,放射性物質(zhì)發(fā)生泄漏繁仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一归园、第九天 我趴在偏房一處隱蔽的房頂上張望黄虱。 院中可真熱鬧,春花似錦庸诱、人聲如沸捻浦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽默勾。三九已至,卻和暖如春聚谁,著一層夾襖步出監(jiān)牢的瞬間母剥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工形导, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留环疼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓朵耕,卻偏偏與公主長得像炫隶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阎曹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容