前端面試題之EventLoop、宏任務(wù)與微任務(wù)

什么是EventLoop吨娜?

理解概念之前,咱們先來兩個"栗子"吃~

栗子一:

console.log("我是")
setTimeout(function() {
    console.log("姐姐")
}, 0)
console.log("超凡的")

// 輸出答案 “我是超凡的姐姐”

栗子二:

console.log("我是")
setTimeout(function() {
    console.log("姐姐(天津味兒的)")
}, 0)
new Promise(()=>{
    console.log("特別的")
}).then("哈哈哈")
console.log("超凡的")

//輸出答案 "我是特別的超凡的哈哈哈哈姐姐(天津味兒的)"

那各位猜對/猜錯的小伙伴淘钟,其實以上JS代碼能夠在瀏覽器中有效執(zhí)行的過程宦赠,就是瀏覽器的EventLoop

總結(jié):EvenLoop即事件循環(huán),也就是瀏覽器或Node的一種能夠javaScript單線程運行時不會阻塞的一種機制/運行機制

那么問題來了米母,為何會如何輸出勾扭?那就要說到宏任務(wù)&微任務(wù)

首先說一下宏任務(wù)和微任務(wù)的執(zhí)行內(nèi)容和范圍

宏任務(wù):主線程要執(zhí)行的代碼 & 定時器/延時器

微任務(wù):Promise的.then .catch中需要執(zhí)行的內(nèi)容

每一個宏任務(wù)都是獨立的個體,上一個宏任務(wù)執(zhí)行完铁瞒,才會考慮下一個宏任務(wù)妙色。第一個宏任務(wù)隊列里的內(nèi)容執(zhí)行完畢時,會進(jìn)行判斷看是否有微任務(wù)慧耍,如果滿足條件的微任務(wù)身辨,執(zhí)行完所有的微任務(wù)丐谋,才會執(zhí)行下一個宏任務(wù)。


img1.png

EventLoop事件循環(huán)隊列

  1. Js是單線程的栅表,Js執(zhí)行時笋鄙,主線程遇到了異步函數(shù)不會停留,放入執(zhí)行隊列
  2. 滿足條件后怪瓶,將執(zhí)行隊列的內(nèi)容,放入任務(wù)隊列中排隊
  3. 主線程執(zhí)行完畢代碼空閑后践美,才會考慮任務(wù)隊列中的代碼
img2.png

題目一:無微任務(wù)

console.log("我是小姐姐,") //宏任務(wù)1
setTimeout(function(){
   console.log("你是誰洗贰?") // 宏任務(wù)2(屬于下一個宏任務(wù),定時器/延時器屬于異步內(nèi)容,放入執(zhí)行棧后陨倡,并放入任務(wù)隊列等待執(zhí)行)
})        
console.log("我們認(rèn)識一下,") //宏任務(wù)1
//執(zhí)行順序   執(zhí)行宏任務(wù)1內(nèi)容完畢后敛滋,沒有滿足條件的微任務(wù),直接執(zhí)行下一個宏任務(wù)2
//輸出結(jié)果   我是小姐姐,我們認(rèn)識一下,你是誰兴革?

題目二:有微任務(wù)

說明補充1:promise的內(nèi)部既包含宏任務(wù)也包含微任務(wù)绎晃,promise內(nèi)部執(zhí)行為宏任務(wù),Promise的.then .catch中需要執(zhí)行的內(nèi)容執(zhí)行為微任務(wù)

console.log("我是")  //宏任務(wù)1
setTimeout(function() {
    console.log("姐姐(天津味兒的)")   //宏任務(wù)2 (這里就不多說了.....)
}, 0)     
new Promise(()=>{
    console.log("特別的")   //宏任務(wù)1 (看下方的補充1)
}).then("哈哈哈")  // 滿足條件的微任務(wù)杂曲,宏任務(wù)1執(zhí)行完畢后庶艾,執(zhí)行微任務(wù),微任務(wù)執(zhí)行完畢后執(zhí)行宏任務(wù)2 
console.log("超凡的") // 宏任務(wù)1

//輸出答案 "我是特別的超凡的哈哈哈哈姐姐(天津味兒的)"

題目三:什么都有

說明補充2:async表示函數(shù)是異步的的擎勘,async只有遇到了await開始咱揍,才是異步的開始。

async function fn(){
    console.log('111')
}
console.log('222')
//沒有await棚饵,代碼正常輸出 111222

說明補充3:await后的內(nèi)容為宏任務(wù)煤裙,await下的內(nèi)容可以理解為.then后面的內(nèi)容,相當(dāng)于微任務(wù)

async function fn(){
    console.log("111")  //宏任務(wù)1
    const res = await fn2()// 宏任務(wù)1 fn2() await后的內(nèi)容為宏任務(wù)
    console.log(res) //微任務(wù)1  await下的內(nèi)容可以理解為.then后面的內(nèi)容噪漾,相當(dāng)于微任務(wù)
}
function fn2(){
    console.log('222') //宏任務(wù)1 
    return 3 //宏任務(wù)1 
}
fn()//宏任務(wù)1  
//輸出結(jié)果為 111 222 3

小霸王來了(我們按照以上內(nèi)容自己分析)

console.log('script start')

async function async1() {
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2 end')
}
async1()

setTimeout(function() {
  console.log('setTimeout')
}, 0)

new Promise(resolve => {
  console.log('Promise')
  resolve()
})
  .then(function() {
    console.log('promise1')
  })
  .then(function() {
    console.log('promise2')
  })

console.log('script end')

分析如下

console.log('script start')  //宏任務(wù)1

async function async1() {
  await async2()    // 宏任務(wù)1 async2()   **await后的內(nèi)容為宏任務(wù)硼砰,await下的內(nèi)容為異步任務(wù)**
  console.log('async1 end')   //微任務(wù)1
}
async function async2() {
  console.log('async2 end')  //宏任務(wù)1 
}
async1() // 宏任務(wù)1

setTimeout(function() {
  console.log('setTimeout')  //宏任務(wù)2
}, 0)

new Promise(resolve => {
  console.log('Promise')  //宏任務(wù)1
  resolve()   //宏任務(wù)1
})
  .then(function() {
    console.log('promise1')  //微任務(wù)2
  })
  .then(function() {
    console.log('promise2') //微任務(wù)3
  })

console.log('script end') //宏任務(wù)1

輸出順序為宏任務(wù)1: script start    async2 end     Promise    script end
微任務(wù)依次執(zhí)行:async1 end   promise1    promise2 
下一個宏任務(wù): setTimeout

看完題目二、題目三的兩個補充條件后欣硼,面試后大部分的宏任務(wù)和微任務(wù)練習(xí)題基本不會出錯题翰,也可以多看一些文章,加深理解分别,一起加油遍愿,歡迎互動和補充~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耘斩,隨后出現(xiàn)的幾起案子沼填,更是在濱河造成了極大的恐慌,老刑警劉巖括授,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坞笙,死亡現(xiàn)場離奇詭異岩饼,居然都是意外死亡,警方通過查閱死者的電腦和手機薛夜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門籍茧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梯澜,你說我怎么就攤上這事寞冯。” “怎么了晚伙?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵吮龄,是天一觀的道長。 經(jīng)常有香客問我咆疗,道長漓帚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任午磁,我火速辦了婚禮尝抖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘迅皇。我一直安慰自己昧辽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布喧半。 她就那樣靜靜地躺著奴迅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挺据。 梳的紋絲不亂的頭發(fā)上取具,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音扁耐,去河邊找鬼暇检。 笑死,一個胖子當(dāng)著我的面吹牛婉称,可吹牛的內(nèi)容都是我干的块仆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼王暗,長吁一口氣:“原來是場噩夢啊……” “哼悔据!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俗壹,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤科汗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绷雏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體头滔,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡怖亭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了坤检。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兴猩。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖早歇,靈堂內(nèi)的尸體忽然破棺而出倾芝,到底是詐尸還是另有隱情,我是刑警寧澤缺前,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布蛀醉,位于F島的核電站,受9級特大地震影響衅码,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脊岳,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一逝段、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧割捅,春花似錦奶躯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莫瞬,卻和暖如春儡蔓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疼邀。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工喂江, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旁振。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓获询,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拐袜。 傳聞我的和親對象是個殘疾皇子吉嚣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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