event loop(事件循環(huán)) 一 深入理解

如果面試官問你 JS中的event loop是什么省咨?我相信大多數(shù)人都能答出來JS是單線程語言,只有一個主線程執(zhí)行玷室,執(zhí)行棧零蓉,同步、異步之類穷缤。但是敌蜂,這樣的理解只是淺層的,如果面試官要你再深入解釋津肛,我相信大多數(shù)人都卡住了章喉,不知道還能解釋什么,那么身坐,問題來了秸脱,這種情況怎么辦?

來看這篇文章部蛇,看完了你就知道怎么辦了撞反。

JS頁面的任務(wù)不僅可以按照同步異步來分,也可以分為macro-taskmicro-task

macro-task都有:包括整體代碼script搪花,setTimeout遏片,setInterval
micro-task都有:Promise嘹害,process.nextTick

頁面初始化時,不同的任務(wù)會進入到不同的 Event Queue(事件隊列)

初始化時吮便,會執(zhí)行所有代碼笔呀,將setTimeout等加入到macro-task的事件列表,將Promise等加入到micro-task事件列表髓需。
遇到立即執(zhí)行的代碼许师,則立即執(zhí)行,之后僚匆,會將事件列表中所有的micro-task都執(zhí)行完畢微渠。

第一輪事件循環(huán)結(jié)束。

第二輪事件循環(huán)開始咧擂,拿出第一輪中第一個放入macro-task列表中的事件開始執(zhí)行完畢

第二輪事件循環(huán)結(jié)束逞盆。

第三輪循環(huán)開始,拿出第一輪中第二個放入macro-task列表中的事件開始執(zhí)行完畢

第三輪事件循環(huán)結(jié)束松申。

就像上面這樣云芦,反復執(zhí)行,即事件循環(huán)贸桶。

看了上面的解釋舅逸,接下來,我們來看一個例子:

console.log('1');

setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})

process.nextTick(function() {
    console.log('6');
})

new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})

setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

我們按照上面的理論來分析這段代碼:

首先皇筛,進入到第一輪事件循環(huán):

遇到 console.log('1') 輸出 '1'

遇到 setTimeout琉历,將其回調(diào)函數(shù)加入到 macro-task 事件列表,記為 setTimeout1

遇到 process.nextTick水醋,將其回調(diào)函數(shù)加入到 micro-task 事件列表善已,記為 process1

遇到 new Promise,立即執(zhí)行离例,輸出 ** '7'**换团,then被分發(fā)到 micro-task 事件列表,記為 then1

遇到 setTimeout 將其回調(diào)函數(shù)加入到 macro-task 事件列表宫蛆,記為 setTimeout2

執(zhí)行到這里艘包,我們來數(shù)數(shù)第一輪事件循環(huán)中的任務(wù)列表:

macro-task:setTimeout1,setTimeout2

micro-task:process1, then1

將列表中所有的 micro-task 執(zhí)行完畢耀盗,輸出 '6','8'

第一輪事件循環(huán)正式結(jié)束想虎。

第二輪事件循環(huán)開始:

這時,第一輪輸出結(jié)果是 '1','7','6','8'

macro-task 中叛拷,拿出第一個進入的事件舌厨,即setTimeout1,將其推入到執(zhí)行棧開始執(zhí)行

先輸出:'2'

遇到 process.nextTick忿薇,將其回調(diào)函數(shù)加入到 micro-task 事件列表裙椭,記為 process2

遇到 new Promise躏哩, 立即執(zhí)行,輸出 ** '4'**揉燃,將then回調(diào)函數(shù)加入到 micro-task 事件列表扫尺,記為 then2

執(zhí)行到這里,我們數(shù)數(shù)第二輪事件循環(huán)中的任務(wù)列表:

macro-task:setTimeout1

micro-task:process2炊汤,then2

將列表中所有的 micro-task 執(zhí)行完畢正驻,輸出:'3', '5'

第二輪事件循環(huán)結(jié)束

第三輪事件循環(huán)開始,前兩輪輸出為:'1','7','6','8','2','4','3', '5'

在 macro-task 中抢腐,拿出第二個進入的事件姑曙,即setTimeout2,將其推入到執(zhí)行棧開始執(zhí)行

先輸出:'9'

遇到 process.nextTick迈倍,將其回調(diào)函數(shù)加入到 micro-task 事件列表伤靠,記為 process3

遇到 new Promise, 立即執(zhí)行授瘦,輸出 '11',將then回調(diào)函數(shù)加入到 micro-task 事件列表竟宋,記為 then3

執(zhí)行到這里提完,我們數(shù)數(shù)第三輪事件循環(huán)中的任務(wù)列表:

macro-task:setTimeout2

micro-task:process3,then3

將列表中所有的 micro-task 執(zhí)行完畢丘侠,輸出:'10', '12'

第三輪事件循環(huán)結(jié)束徒欣。

如果還有第四輪,第五輪蜗字,則循環(huán)上面的步驟打肝,這樣的循環(huán),即事件循環(huán)挪捕。

總結(jié)執(zhí)行結(jié)果:'1','7','6','8','2','4','3','5','9','11','10','12'

好粗梭,寫完收工,等待下班去吃大餐级零。

原文作者寫的更好断医,大家可以看看 https://juejin.im/post/59e85eebf265da430d571f89

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奏纪,隨后出現(xiàn)的幾起案子鉴嗤,更是在濱河造成了極大的恐慌,老刑警劉巖序调,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醉锅,死亡現(xiàn)場離奇詭異,居然都是意外死亡发绢,警方通過查閱死者的電腦和手機硬耍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門垄琐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人默垄,你說我怎么就攤上這事此虑。” “怎么了口锭?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵朦前,是天一觀的道長。 經(jīng)常有香客問我鹃操,道長韭寸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任荆隘,我火速辦了婚禮恩伺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椰拒。我一直安慰自己晶渠,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布燃观。 她就那樣靜靜地躺著褒脯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缆毁。 梳的紋絲不亂的頭發(fā)上番川,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音脊框,去河邊找鬼颁督。 笑死,一個胖子當著我的面吹牛浇雹,可吹牛的內(nèi)容都是我干的沉御。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼昭灵,長吁一口氣:“原來是場噩夢啊……” “哼嚷节!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虎锚,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤硫痰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窜护,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體效斑,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年柱徙,在試婚紗的時候發(fā)現(xiàn)自己被綠了缓屠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奇昙。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敌完,靈堂內(nèi)的尸體忽然破棺而出储耐,到底是詐尸還是另有隱情,我是刑警寧澤滨溉,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布什湘,位于F島的核電站,受9級特大地震影響晦攒,放射性物質(zhì)發(fā)生泄漏闽撤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一脯颜、第九天 我趴在偏房一處隱蔽的房頂上張望哟旗。 院中可真熱鬧,春花似錦栋操、人聲如沸闸餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舍沙。三九已至,卻和暖如春蠕啄,著一層夾襖步出監(jiān)牢的瞬間场勤,已是汗流浹背戈锻。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工歼跟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人格遭。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓哈街,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拒迅。 傳聞我的和親對象是個殘疾皇子骚秦,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345