事件循環(huán)Event Loop

一句話解釋

js的主線程是單線程運行的,主線程先執(zhí)行同步代碼饶号,遇到異步操作如ajax請求、定時器等需要在一段時間后再執(zhí)行的事件璧亚,便交給其他線程如請求線程讨韭、定時觸發(fā)線程脂信,滿足條件后就放到任務隊列中癣蟋,主線程執(zhí)行完任務后透硝,就去任務隊列里拉取任務,按照先進先出的原則依次執(zhí)行疯搅,如此循環(huán)濒生;
其中任務隊列分為宏任務隊列與微任務隊列,執(zhí)行完一個宏任務都會去檢查是否有微任務幔欧,執(zhí)行完所有微任務后罪治,頁面更新渲染,再執(zhí)行下一個宏任務礁蔗;

問答

1.為什么JS是單線程的觉义?

  • 防止同時操作同一DOM出現(xiàn)混亂。
  • 所謂的"JS是單線程的"只是指JS的主運行線程只有一個浴井,而不是整個運行環(huán)境都是單線程晒骇。

2.JS單線程如何實現(xiàn)異步?

  • JS異步的實現(xiàn)靠的就是瀏覽器的多線程磺浙,當遇到異步API時洪囤,就將這個任務交給對應的線程,當這個異步API滿足回調條件時撕氧,對應的線程又通過事件觸發(fā)線程將這個事件放入任務隊列瘤缩,然后主線程從任務隊列取出事件繼續(xù)執(zhí)行。
  • JS引擎線程跟GUI線程是互斥的伦泥,一個執(zhí)行就另一個不執(zhí)行剥啤,如果JS長時間運行,GUI線程就不能執(zhí)行不脯,整個頁面就感覺卡死了府怯。

3.為什么要有微任務?

  • 微任務是為了解決效率和實時性問題跨新,處理高優(yōu)先級的任務富腊。

4.常見的宏任務與微任務有哪些?

  • 宏任務macrotask:script(整體代碼)域帐、setTimeout赘被、setInterval、setImmediate肖揣、I/O
  • 微任務microtask:Promise民假、MutaionObserver、process.nextTick(Node)

5.瀏覽器什么時候渲染龙优?

  • 執(zhí)行完一個宏任務以及當前所有微任務后渲染一次羊异;
  • 但并不是每輪event loop都會更新渲染,這取決于是否修改了dom和瀏覽器覺得是否有必要在此時立即將新狀態(tài)呈現(xiàn)給用戶。如果在一幀的時間內(時間并不確定野舶,因為瀏覽器每秒的幀數(shù)總在波動易迹,16.7ms只是估算并不準確)修改了多處dom,瀏覽器可能將變動積攢起來平道,只進行一次繪制睹欲。

6.與Node環(huán)境的事件循環(huán)有什么區(qū)別?

瀏覽器和Node 環(huán)境下一屋,microtask 任務隊列的執(zhí)行時機不同:

  • 瀏覽器端窘疮,microtask 在事件循環(huán)的 macrotask 執(zhí)行完之后執(zhí)行;
  • Node版本>=11冀墨,和瀏覽器表現(xiàn)一致闸衫;
  • Node版本<11,microtask 在事件循環(huán)的各個階段之間執(zhí)行诽嘉,也就是一個階段執(zhí)行完畢蔚出,就會去執(zhí)行microtask隊列的任務;

由于定時器插入時機不同含懊,同一代碼執(zhí)行結果也會不同,如下:

setTimeout(()=>{
    console.log('timer1')
    Promise.resolve().then(function() {
        console.log('promise1')
    })
}, 0)
setTimeout(()=>{
    console.log('timer2')
    Promise.resolve().then(function() {
        console.log('promise2')
    })
}, 0)

Node端分為6個階段岔乔,

  • timers 階段:這個階段執(zhí)行timer(setTimeout酥筝、setInterval)的回調
  • I/O callbacks 階段:處理一些上一輪循環(huán)中的少數(shù)未執(zhí)行的 I/O 回調
  • idle, prepare 階段:僅node內部使用
  • poll 階段:獲取新的I/O事件, 適當?shù)臈l件下node將阻塞在這里
  • check 階段:執(zhí)行 setImmediate() 的回調
  • close callbacks 階段:執(zhí)行 socket 的 close 事件回調
    外部輸入數(shù)據(jù)-->輪詢階段(poll)-->檢查階段(check)-->關閉事件回調階段(close callback)-->定時器檢測階段(timer)-->I/O事件回調階段(I/O callbacks)-->閑置階段(idle, prepare)-->輪詢階段(按照該順序反復運行)

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末雏门,一起剝皮案震驚了整個濱河市嘿歌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茁影,老刑警劉巖宙帝,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異募闲,居然都是意外死亡步脓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門浩螺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靴患,“玉大人,你說我怎么就攤上這事要出≡Ь” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵患蹂,是天一觀的道長或颊。 經常有香客問我砸紊,道長,這世上最難降的妖魔是什么囱挑? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任醉顽,我火速辦了婚禮,結果婚禮上看铆,老公的妹妹穿的比我還像新娘徽鼎。我一直安慰自己盛末,他們只是感情好弹惦,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悄但,像睡著了一般棠隐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檐嚣,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天助泽,我揣著相機與錄音,去河邊找鬼嚎京。 笑死嗡贺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鞍帝。 我是一名探鬼主播诫睬,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帕涌!你這毒婦竟也來了摄凡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚓曼,失蹤者是張志新(化名)和其女友劉穎亲澡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纫版,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡床绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了其弊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞己。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瑞凑,靈堂內的尸體忽然破棺而出末秃,到底是詐尸還是另有隱情,我是刑警寧澤籽御,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布练慕,位于F島的核電站惰匙,受9級特大地震影響,放射性物質發(fā)生泄漏铃将。R本人自食惡果不足惜项鬼,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劲阎。 院中可真熱鬧绘盟,春花似錦、人聲如沸悯仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锡垄。三九已至沦零,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間货岭,已是汗流浹背路操。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留千贯,地道東北人屯仗。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像搔谴,于是被迫代替她去往敵國和親魁袜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355