事件循環(huán) event loop

// 本文僅用于自己對(duì)知識(shí)理解和記錄

參考文章:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

單線程的JavaScript

單線程一位置JavaScript一次只能做一件事奶甘;下一件事要排隊(duì);顯然我們認(rèn)為多線程更有效率艇潭;同時(shí)幾個(gè)窗口排隊(duì)辦事肯定快攒菠;
但是如果是多線程操作汁胆,a和b都修改c;a刪除了c一個(gè)屬性而b缺在a的該屬性上添加內(nèi)容;這是以誰(shuí)的操作為準(zhǔn)?
所以單線程反而把復(fù)雜的事簡(jiǎn)單化了

但是單線程上的任務(wù)排隊(duì)進(jìn)行古瓤,只有前一個(gè)任務(wù)完成才進(jìn)行下一個(gè)任務(wù),當(dāng)先一個(gè)任務(wù)耗時(shí)很長(zhǎng)時(shí)后面的任務(wù)就停滯了腺阳,例如ajax請(qǐng)求要等結(jié)果得到才會(huì)繼續(xù)執(zhí)行落君;

這時(shí)就衍生出了異步任務(wù)同步任務(wù)

下面是引用阮一峰博客中的總結(jié)

(1)所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)亭引。
(2)主線程之外绎速,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果焙蚓,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件纹冤。
(3)一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢洒宝,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件萌京。那些對(duì)應(yīng)的異步任務(wù)雁歌,于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧枫夺,開(kāi)始執(zhí)行将宪。
(4)主線程不斷重復(fù)上面的第三步。

你不知道的javaScript(中卷)把下面要說(shuō)的micro task隊(duì)列叫做任務(wù)隊(duì)列橡庞,任務(wù)隊(duì)列也有循環(huán)叫做任務(wù)循環(huán)job loop)甚至可能無(wú)限循環(huán)導(dǎo)致程序餓死较坛;事件循環(huán)event loop)的隊(duì)列稱之為事件循環(huán)隊(duì)列;以事件隊(duì)列和任務(wù)隊(duì)列區(qū)分

事件循環(huán)(Event Loop)

事件隊(duì)列是一個(gè)先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)扒最,排在前面的事件丑勤,優(yōu)先被主線程讀取。主線程只要執(zhí)行棧一清空吧趣,事件隊(duì)列上第一位的事件就自動(dòng)進(jìn)入主線程法竞。

當(dāng)我們按下按鈕,他的事件處理程序會(huì)添加到事件隊(duì)列8强挫,并在主線程的執(zhí)行棧清空后立刻讀取事件隊(duì)列*中的第一個(gè)事件

這里就要說(shuō)到定時(shí)器(setTimeout)定時(shí)器并不是設(shè)置100ms就是在100ms后執(zhí)行代碼岔霸,而是在100ms后把要執(zhí)行的代碼添加到事件隊(duì)列。如果在這個(gè)時(shí)間點(diǎn)上主線程空閑則立即俯渤,所以setTimeout是不精確的呆细。

主線程從"事件隊(duì)列"中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的八匠,所以整個(gè)的這種運(yùn)行機(jī)制又稱為Event Loop(事件循環(huán))

任務(wù)(事件)和微任務(wù)(task 和 micro task)

然而在一次Ladaza的面試中被問(wèn)到setTimeout和Promise.then的執(zhí)行順序時(shí)我答砸了絮爷,這里捋一下。

看下面的log順序

console.log('script start');

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

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

答案應(yīng)該是:

// script start
// script end
// promise1
// promise2
// setTimeout

例子中setTimeout在事件隊(duì)列中加入一個(gè)新任務(wù)而console.log('script end');是當(dāng)前正在執(zhí)行任務(wù)(事件)的一部分所以在setTimeout之前打印梨树。

而其中promise.then屬于micro task坑夯,micro task排在當(dāng)前事件循環(huán)tick結(jié)尾處,只要當(dāng)前任務(wù)(事件)執(zhí)行完成清空所有的排隊(duì)的micro task抡四;

而setTimeout是調(diào)度另一個(gè)事件循環(huán)tick所以會(huì)在promise.then之后執(zhí)行

排隊(duì)的micro task也叫做job loop(任務(wù)循環(huán))

在瀏覽器環(huán)境中柜蜈,常見(jiàn)的 macro task 有 setTimeout、MessageChannel床嫌、postMessage跨释、setImmediate;常見(jiàn)的 micro task 有 MutationObsever 和 Promise.then厌处。

這里只解釋micro task的執(zhí)行時(shí)機(jī)鳖谈,后面結(jié)合vue的nextTick做理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阔涉,一起剝皮案震驚了整個(gè)濱河市缆娃,隨后出現(xiàn)的幾起案子捷绒,更是在濱河造成了極大的恐慌,老刑警劉巖贯要,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暖侨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崇渗,警方通過(guò)查閱死者的電腦和手機(jī)字逗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宅广,“玉大人葫掉,你說(shuō)我怎么就攤上這事「” “怎么了俭厚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驶臊。 經(jīng)常有香客問(wèn)我挪挤,道長(zhǎng),這世上最難降的妖魔是什么关翎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任扛门,我火速辦了婚禮,結(jié)果婚禮上纵寝,老公的妹妹穿的比我還像新娘尖飞。我一直安慰自己,他們只是感情好店雅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著贞铣,像睡著了一般闹啦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辕坝,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天窍奋,我揣著相機(jī)與錄音,去河邊找鬼酱畅。 笑死琳袄,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纺酸。 我是一名探鬼主播窖逗,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼餐蔬!你這毒婦竟也來(lái)了碎紊?” 一聲冷哼從身側(cè)響起佑附,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仗考,沒(méi)想到半個(gè)月后音同,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秃嗜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年权均,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锅锨。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叽赊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橡类,到底是詐尸還是另有隱情蛇尚,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布顾画,位于F島的核電站取劫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏研侣。R本人自食惡果不足惜谱邪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庶诡。 院中可真熱鬧惦银,春花似錦、人聲如沸末誓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)喇澡。三九已至迅栅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晴玖,已是汗流浹背读存。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呕屎,地道東北人让簿。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秀睛,于是被迫代替她去往敵國(guó)和親尔当。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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