瀏覽器中的事件循環(huán)(Event Loop)

EventLoop 解決了什么問題(背景)?

JavaScript單線程是一門單線程的語言,同一個時間只能做一件事情蔬蕊,如果當一個語句需要執(zhí)行很長時間的話(比如:請求、定時器哥谷、讀取文件等等)岸夯,后面的語句就得一直等著前面的語句執(zhí)行結束后才會開始執(zhí)行。因此们妥,JavaScript將所有執(zhí)行任務分為了同步任務異步任務猜扮。而Event Loop就是瀏覽器或Node解決JS單線程運行時不會阻塞的一種機制

什么是同步任務和異步任務

同步任務:又叫做非耗時任務,指的是在主線程上排隊執(zhí)行的那些任務监婶,只有前一個任務執(zhí)行完畢旅赢,才能執(zhí)行后一個任務

異步任務:又叫做耗時任務齿桃,異步任務由JavaScript 委托給宿主環(huán)境進行執(zhí)行,當異步任務執(zhí)行完成后煮盼,會通知JavaScript 主線程執(zhí)行異步任務的回調函數(shù)

什么是宏任務和微任務

JavaScript 把異步任務又做了進一步的劃分短纵,異步任務又分為兩類:宏任務和微任務

宏任務:當前調用棧執(zhí)行的任務

微任務:需要在此次宏任務執(zhí)行結束后,下一次宏任務執(zhí)行前僵控,執(zhí)行的任務

宏任務 微任務
定時器(setTimeout香到、setInterval) Promise(then、catch报破、finally)
setImmediate MutationObserver
requestAnimationFrame process.nextTick(Node)
script標簽下整塊代碼

事件循環(huán)的進程模型

event-loop.png
  • 從宏任務隊列中悠就,按照入隊順序,找到第一個執(zhí)行的宏任務充易,放入調用棧理卑,開始執(zhí)行
  • 執(zhí)行遇到異步任務,如果是微任務蔽氨,將放到微任務隊列中,如果是宏任務帆疟,則放到宏任務隊列中
  • 同步任務執(zhí)行完成后(即調用棧清空后)鹉究,該宏任務被推出宏任務隊列,然后微任務隊列開始按照入隊順序踪宠,依次執(zhí)行其中的微任務自赔,直至微任務隊列清空為止
  • 當微任務隊列清空后,一個事件循環(huán)結束
  • 接著從宏任務隊列中柳琢,找到下一個執(zhí)行的宏任務绍妨,開始第二個事件循環(huán),直至宏任務隊列清空為止

常見面試題

// 整體代碼是一個宏任務柬脸,放入到宏任務隊列中他去,進入調用棧執(zhí)行
console.log(1);  
setTimeout(()=>{
    console.log(2);
    Promise.resolve().then(res => { console.log(3) });
    setTimeout(()=>{  
        console.log(4); 
        Promise.resolve().then(res => { console.log(5) });
    }, 0)
}, 30)

Promise.resolve().then(res=>{ console.log(6) }) 

const fn = async () => {
    console.log(7)  
    // 遇到了await 會等待promise完成,同時交出執(zhí)行權
    await new Promise((resolve)=>{
        // new Promise 中的代碼立即執(zhí)行
        console.log(8) 
        setTimeout(()=>{
            resolve(); 
            console.log(9)
        }, 20)
    }).then(res => console.log(10));
    console.log(11)
}
// fn執(zhí)行
fn();

setTimeout(()=>{
    console.log(12); 
    new Promise((resolve) => {
        console.log(13)
        resolve();
    }).then(res => { console.log(14) })
}, 0)
// 打印結果:1 7 8 6 12 13 14 9 10 11 2 3 4 5
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末倒堕,一起剝皮案震驚了整個濱河市灾测,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垦巴,老刑警劉巖媳搪,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骤宣,居然都是意外死亡秦爆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門憔披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來等限,“玉大人,你說我怎么就攤上這事【ⅲ” “怎么了拗胜?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怒允。 經常有香客問我埂软,道長,這世上最難降的妖魔是什么纫事? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任勘畔,我火速辦了婚禮,結果婚禮上丽惶,老公的妹妹穿的比我還像新娘炫七。我一直安慰自己,他們只是感情好钾唬,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布万哪。 她就那樣靜靜地躺著,像睡著了一般抡秆。 火紅的嫁衣襯著肌膚如雪奕巍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天儒士,我揣著相機與錄音的止,去河邊找鬼。 笑死着撩,一個胖子當著我的面吹牛诅福,可吹牛的內容都是我干的。 我是一名探鬼主播拖叙,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氓润,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了憋沿?” 一聲冷哼從身側響起旺芽,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辐啄,沒想到半個月后采章,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡壶辜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年悯舟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砸民。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抵怎,死狀恐怖奋救,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情反惕,我是刑警寧澤尝艘,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站姿染,受9級特大地震影響背亥,放射性物質發(fā)生泄漏。R本人自食惡果不足惜悬赏,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一狡汉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闽颇,春花似錦盾戴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剩膘,卻和暖如春可婶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背援雇。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椎扬,地道東北人惫搏。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像蚕涤,于是被迫代替她去往敵國和親筐赔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容