日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

深入分析JavaScript 事件循環(huán)(Event Loop)

瀏覽:116日期:2023-10-23 11:47:27

事件循環(huán)(Event Loop),是每個(gè)JS開發(fā)者都會(huì)接觸到的概念,但是剛接觸時(shí)可能會(huì)存在各種疑惑。

眾所周知,JS是單線程的,即同一時(shí)間只能運(yùn)行一個(gè)任務(wù)。一般情況下這不會(huì)引發(fā)問題,但是如果我們有一個(gè)耗時(shí)較多的任務(wù),我們必須等該任務(wù)執(zhí)行完畢才能進(jìn)入下一個(gè)任務(wù),然而等待的這段時(shí)間常常讓我們無法忍受,因?yàn)槲覀冞@段時(shí)間什么都不能做,包括頁面也是鎖死狀態(tài)。

好在,時(shí)代在進(jìn)步,瀏覽器向我們提供了JS引擎不具備的特性:Web API。Web API包括DOM API、定時(shí)器、HTTP請求等特性,可以幫助我們實(shí)現(xiàn)異步、非阻塞的行為。我們可以通過異步執(zhí)行任務(wù)的方法來解決單線程的弊端,事件循環(huán)為此而生。

提問QAQ:為什么JavaScript是單線程的?

多個(gè)線程表示您可以同時(shí)獨(dú)立執(zhí)行程序的多個(gè)部分。確定一種語言是單線程還是多線程的最簡單方法是看它擁有有多少個(gè)調(diào)用堆棧。JS 只有一個(gè),所以它是單線程語言。

將JS設(shè)計(jì)為單線程是由其用途運(yùn)行環(huán)境等因素決定的,作為瀏覽器腳本語言,JS的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來很復(fù)雜的同步問題。同時(shí),單線程執(zhí)行效率高。

1. Event Loop舊印象

大家熟悉的關(guān)于事件循環(huán)的機(jī)制說法大概是:主進(jìn)程執(zhí)行完了之后,每次從任務(wù)隊(duì)列里取一個(gè)任務(wù)執(zhí)行。如圖所示,所有的任務(wù)分為同步任務(wù)和異步任務(wù),同步任務(wù)直接進(jìn)入任務(wù)隊(duì)列-->主程序執(zhí)行;異步任務(wù)則會(huì)掛起,等待其有返回值時(shí)進(jìn)入任務(wù)隊(duì)列從而被主程序執(zhí)行。異步任務(wù)會(huì)通過任務(wù)隊(duì)列的機(jī)制(先進(jìn)先出的機(jī)制)來進(jìn)行協(xié)調(diào)。具體如圖所示:

深入分析JavaScript 事件循環(huán)(Event Loop)

同步和異步任務(wù)分別進(jìn)入不同的執(zhí)行環(huán)境,同步的進(jìn)入主線程,即主執(zhí)行棧,異步的進(jìn)入任務(wù)隊(duì)列。主線程內(nèi)的任務(wù)執(zhí)行完畢為空,會(huì)去任務(wù)隊(duì)列讀取對應(yīng)的任務(wù),推入主線程執(zhí)行。 上述過程的不斷重復(fù)就是我們所熟悉的Event Loop (事件循環(huán))。但是promise出現(xiàn)之后,這個(gè)說法就不太準(zhǔn)確了。

2. Event Loop 后印象

2.1 理論

這里首先用一張圖展示JavaScript的事件循環(huán):

深入分析JavaScript 事件循環(huán)(Event Loop)

直接看這張圖,可能黑人問號已經(jīng)出現(xiàn)在同學(xué)的腦海。。。

這里將task分為兩大類,分別是macroTask(宏任務(wù))和microTask(微任務(wù)).一次事件循環(huán):先運(yùn)行macroTask隊(duì)列中的一個(gè),然后運(yùn)行microTask隊(duì)列中的所有任務(wù)。接著開始下一次循環(huán)(只是針對macroTask和microTask,一次完整的事件循環(huán)會(huì)比這個(gè)復(fù)雜的多)。

那什么是macroTask?什么是microTask呢?

JavaScript引擎把我們的所有任務(wù)分門別類,一部分歸為macroTask,另外一部分歸為microTack,下面是類別劃分:

macroTask:

setTimeout setInterval setImmediate requestAnimationFrame I/O UI rendering

microTask:

process.nextTick Promise Object.observe MutationObserver

我們所熟悉的定時(shí)器就屬于macroTask,僅僅了解macroTask的機(jī)制還是不夠的。為直觀感受兩種隊(duì)列的區(qū)別,下面上代碼進(jìn)行實(shí)踐感知。

2.2 實(shí)踐

以setTimeout、process.nextTick、promise為例直觀感受下兩種任務(wù)隊(duì)列的運(yùn)行方式。

console.log(’main1’);process.nextTick(function() { console.log(’process.nextTick1’);});setTimeout(function() { console.log(’setTimeout’); process.nextTick(function() { console.log(’process.nextTick2’); });}, 0);new Promise(function(resolve, reject) { console.log(’promise’); resolve();}).then(function() { console.log(’promise then’);});console.log(’main2’);

別著急看答案,先以上面的理論自己想想,運(yùn)行結(jié)果會(huì)是啥?

最終結(jié)果是這樣的:

main1promisemain2process.nextTick1promise then

// 第二次事件循環(huán)setTimeoutprocess.nextTick2

process.nextTick 和 promise then在 setTimeout 前面輸出,已經(jīng)證明了macroTask和microTask的執(zhí)行順序。但是有一點(diǎn)必須要指出的是。上面的圖容易給人一個(gè)錯(cuò)覺,就是主進(jìn)程的代碼執(zhí)行之后,會(huì)先調(diào)用macroTask,再調(diào)用microTask,這樣在第一個(gè)循環(huán)里一定是macroTask在前,microTask在后。

但是最終的實(shí)踐證明:在第一個(gè)循環(huán)里,process.nextTick1和promise then這兩個(gè)microTask是在setTimeout這個(gè)macroTask里之前輸出的,這是因?yàn)镻romises/A+規(guī)范規(guī)定主進(jìn)程的代碼也屬于macroTask。

主進(jìn)程這個(gè)macroTask(也就是main1、promise和main2)執(zhí)行完了,自然會(huì)去執(zhí)行process.nextTick1和promise then這兩個(gè)microTask。這是第一個(gè)循環(huán)。之后的setTimeout和process.nextTick2屬于第二個(gè)循環(huán)

別看上面那段代碼好像特別繞,把原理弄清楚了,都一樣 ~

requestAnimationFrame、Object.observe(已廢棄) 和 MutationObserver這三個(gè)任務(wù)的運(yùn)行機(jī)制大家可以從上面看到,不同的只是具體用法不同。重點(diǎn)說下UI rendering。在HTML規(guī)范:event-loop-processing-model里敘述了一次事件循環(huán)的處理過程,在處理了macroTask和microTask之后,會(huì)進(jìn)行一次Update the rendering,其中細(xì)節(jié)比較多,總的來說會(huì)進(jìn)行一次UI的重新渲染。

3. 小結(jié)

總而言之,記住一次事件循環(huán):先運(yùn)行macroTask隊(duì)列中的一個(gè),然后運(yùn)行microTask隊(duì)列中的所有任務(wù)。接著開始下一次循環(huán)。

參考文獻(xiàn):

JavaScript Event Loop相關(guān)原理解析 深入理解事件循環(huán)機(jī)制 JavaScript運(yùn)行機(jī)制

以上就是深入分析JavaScript 事件循環(huán)(Event Loop)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 事件循環(huán)(Event Loop)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产+成+人+亚洲欧洲在线| av中文字幕在线观看第一页| 欧美精品97| 在线日韩成人| 亚洲一区二区三区中文字幕在线观看| 国产理论在线| 亚洲欧美久久久| 国产精品成人自拍| 美女久久久久| 免费国产自久久久久三四区久久 | 亚洲激情不卡| 久久中文字幕导航| 午夜性色一区二区三区免费视频| 精品国产一区二区三区噜噜噜| 丝袜美腿成人在线| 亚洲精品123区| 日本韩国欧美超级黄在线观看| 国产字幕视频一区二区| 夜夜嗨av一区二区三区网站四季av| 成人国产精品久久| 香蕉久久久久久久av网站| 久久国产免费| 大香伊人久久精品一区二区| 欧美激情日韩| 国产精品s色| 亚洲精品大片| 三级亚洲高清视频| 视频在线在亚洲| 亚洲中午字幕| 韩国精品主播一区二区在线观看 | 免费在线观看视频一区| 日本免费新一区视频| 国产成人免费| 久久男女视频| 亚洲三级在线| 国产999精品在线观看| 国产成人免费av一区二区午夜| 午夜久久福利| 日韩制服丝袜先锋影音| 日韩欧美精品一区二区综合视频| 欧美经典一区| 午夜视频精品| 亚洲视频国产精品| 麻豆国产一区| 欧美搞黄网站| 久久精品国产一区二区| 日韩精品一页| 日韩在线高清| 在线综合视频| 日本激情一区| 91精品国产自产在线丝袜啪| 精品欧美久久| 国产精品尤物| 欧美在线亚洲| 精品久久97| 久久国际精品| 日韩国产91| 亚洲欧美日韩国产| 久久久久免费| 精品一区二区三区的国产在线观看| 欧美日韩一视频区二区| 成人在线视频区| 久久久精品五月天| 国产欧美日韩免费观看| 国产suv精品一区| 国产欧美日韩免费观看| 日韩在线一二三区| 蜜桃久久精品一区二区| 久久美女性网| 精品一区二区三区视频在线播放| 日本成人在线视频网站| 一区二区高清| 婷婷视频一区二区三区| 免费观看在线色综合| 爽好多水快深点欧美视频| 亚洲一区久久| 亚洲欧美网站在线观看| 四虎在线精品| 欧美日韩一区二区高清| 欧美日韩一区二区三区不卡视频| 国产成人1区| 国产精品17p| 国产成人精品亚洲线观看| 欧美一区免费| 97久久超碰| 久久精品国产99国产精品| 91亚洲自偷观看高清| 欧美中文日韩| 日本不卡视频在线| 国产精品任我爽爆在线播放| 麻豆91在线播放| 久久精品欧美一区| 日韩视频网站在线观看| 欧美高清不卡| 久久午夜精品| 国产日本久久| 国精品一区二区| 亚洲3区在线| 五月亚洲婷婷 | 国产suv精品一区| av高清不卡| 在线亚洲成人| 91亚洲一区| 婷婷亚洲综合| 亚洲精品综合| 亚欧洲精品视频在线观看| 国产精品日韩精品中文字幕| 肉色欧美久久久久久久免费看 | 神马午夜久久| 日韩高清三区| 久久久久伊人| 日韩一区二区三区高清在线观看| 黄色网一区二区| 亚洲综合色婷婷在线观看| av日韩中文| 蜜臀久久久99精品久久久久久| 久久影视三级福利片| 亚洲午夜黄色| 红杏一区二区三区| 日韩精品亚洲专区| 三级一区在线视频先锋| 激情久久婷婷| 天堂中文在线播放| 久久中文在线| 国产精品99久久久久久董美香| 亚洲色图网站| 日韩电影二区| 国产一区二区久久久久| 欧美久久一区二区三区| 日本在线观看不卡视频| 久久都是精品| 一区二区三区四区日韩| 五月婷婷六月综合| 日韩在线视频精品| 国产一区二区三区国产精品| 麻豆精品在线视频| 欧美国产视频| 久久午夜视频| 亚洲一区二区小说| 日本不卡一二三区黄网| 国产日产高清欧美一区二区三区 | 国产精品videossex久久发布| 蜜桃视频一区二区| 日韩视频一二区| 中文字幕亚洲影视| 蜜桃一区二区三区在线观看| 中文无码日韩欧| 亚洲精品日本| 精品欧美一区二区三区在线观看| 综合一区在线| 99精品一区| 国产精品嫩草99av在线| 亚洲欧美日韩国产| 亚洲综合图色| 蜜桃视频一区二区| 欧美啪啪一区| 成人精品久久| 欧美一区二区三区激情视频 | 亚洲高清久久| 久热re这里精品视频在线6| 日韩国产欧美三级| 国产白浆在线免费观看| 日韩午夜一区| 麻豆高清免费国产一区| 91精品国产福利在线观看麻豆| 伊人精品一区| 日韩va欧美va亚洲va久久| 日韩欧美精品| 日韩高清电影一区| 99国产精品久久久久久久成人热| 日本不卡的三区四区五区| 久久中文字幕一区二区| 蜜桃成人精品| 国产精品igao视频网网址不卡日韩| 欧美www视频在线观看| 色老板在线视频一区二区| 亚洲va久久| 成人日韩av| 日本一区中文字幕| 欧美福利一区| 人人草在线视频| 亚州精品视频| 久久高清免费观看| 中文av在线全新| 久久久国产精品入口麻豆| 欧美资源在线| 99久久婷婷| 麻豆精品网站| 久久久一本精品| 美女性感视频久久| 国产精品手机在线播放| 日本成人精品| 午夜亚洲精品| 国产一区二区三区自拍| 韩国久久久久久| 久久99蜜桃| 久久gogo国模啪啪裸体| 国产精品白丝久久av网站| 精品视频黄色| 91成人精品在线|