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

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

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

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

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

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

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

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

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

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

1. Event Loop舊印象

大家熟悉的關(guān)于事件循環(huán)的機(jī)制說法大概是:主進(jìn)程執(zhí)行完了之后,每次從任務(wù)隊列里取一個任務(wù)執(zhí)行。如圖所示,所有的任務(wù)分為同步任務(wù)和異步任務(wù),同步任務(wù)直接進(jìn)入任務(wù)隊列-->主程序執(zhí)行;異步任務(wù)則會掛起,等待其有返回值時進(jìn)入任務(wù)隊列從而被主程序執(zhí)行。異步任務(wù)會通過任務(wù)隊列的機(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ù)隊列。主線程內(nèi)的任務(wù)執(zhí)行完畢為空,會去任務(wù)隊列讀取對應(yīng)的任務(wù),推入主線程執(zhí)行。 上述過程的不斷重復(fù)就是我們所熟悉的Event Loop (事件循環(huán))。但是promise出現(xiàn)之后,這個說法就不太準(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隊列中的一個,然后運(yùn)行microTask隊列中的所有任務(wù)。接著開始下一次循環(huán)(只是針對macroTask和microTask,一次完整的事件循環(huán)會比這個復(fù)雜的多)。

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

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

macroTask:

setTimeout setInterval setImmediate requestAnimationFrame I/O UI rendering

microTask:

process.nextTick Promise Object.observe MutationObserver

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

2.2 實踐

以setTimeout、process.nextTick、promise為例直觀感受下兩種任務(wù)隊列的運(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é)果會是啥?

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

main1promisemain2process.nextTick1promise then

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

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

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

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

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

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

3. 小結(jié)

總而言之,記住一次事件循環(huán):先運(yùn)行macroTask隊列中的一個,然后運(yùn)行microTask隊列中的所有任務(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久久,三上悠亚国产精品一区二区三区
91精品国产乱码久久久久久久| 欧美黑人做爰爽爽爽| 激情偷拍久久| 视频在线观看91| 欧美一区免费| 欧美欧美黄在线二区| 国产精品多人| 日本美女一区| 男人天堂欧美日韩| 国产精品大片| 亚洲成人精品| 日韩精品福利一区二区三区| 国精品产品一区| 自拍日韩欧美| 欧美日韩99| 成人日韩精品| 日本不卡一二三区黄网| 国产成人免费精品| 在线亚洲欧美| 国产精品久久国产愉拍| 国产99精品一区| 免费在线观看成人| 老司机精品在线| 欧美/亚洲一区| 日韩精品免费观看视频| 日韩国产一区| 亚洲tv在线| 电影天堂国产精品| 日本成人在线网站| 久久久久久久久丰满| 亚洲精品在线国产| 国产v日韩v欧美v| 亚洲丝袜啪啪| 色吊丝一区二区| 欧美一区二区三区免费看| 色天使综合视频| 亚洲精选成人| 精精国产xxxx视频在线野外| 日韩精品成人| 99国内精品| 精品国产乱码久久久| 蜜臀va亚洲va欧美va天堂| 高清一区二区三区av| 亚洲精品激情| 亚洲成人精品| 欧美交a欧美精品喷水| 国产精品腿扒开做爽爽爽挤奶网站| 麻豆精品久久久| 久久xxxx精品视频| 日韩精品永久网址| 国产欧美三级| 欧洲毛片在线视频免费观看| 国产精品成人自拍| 一二三区精品| 九一精品国产| 97精品97| 国产精品久久久久毛片大屁完整版| 国产毛片久久| 日韩一区亚洲二区| 麻豆国产精品视频| 日韩av中文在线观看| 日韩视频二区| 久久精品免费一区二区三区| 精品久久亚洲| 欧美片网站免费| 在线一区二区三区视频| 日韩欧美中文| 国产一区二区久久久久| 国产精品日本一区二区不卡视频| 亚洲涩涩av| 国产精品日韩欧美一区| 久久久久99| 中文在线资源| 国产成人在线中文字幕| 国产精品igao视频网网址不卡日韩| 蜜芽一区二区三区| 欧美特黄一区| 神马日本精品| 97精品国产福利一区二区三区| 美女视频黄久久| 国产伦精品一区二区三区千人斩| 视频在线观看一区二区三区| 黄色av一区| 亚洲电影在线| 欧美日中文字幕| 亚洲不卡系列| 视频二区不卡| 亚洲成人精品| 在线日韩一区| 国内精品福利| 狠狠久久婷婷| 精品91久久久久| 女同性一区二区三区人了人一| 亚洲高清av| 五月婷婷亚洲| 国产一级一区二区| 亚洲激情欧美| 久久福利毛片| 免费人成黄页网站在线一区二区| 玖玖精品视频| 婷婷成人av| 国产欧美午夜| 欧美xxxx性| 国产+成+人+亚洲欧洲在线| 日产精品一区二区| 欧美羞羞视频| 国产精品88久久久久久| 日韩一区二区免费看| 美女久久一区| 亚洲图片久久| 欧美日本二区| 国产精品欧美一区二区三区不卡 | 国产一区二区三区四区五区传媒| 狂野欧美性猛交xxxx| 国产一区二区三区日韩精品| av中文字幕在线观看第一页| 99久久精品费精品国产| 午夜精品婷婷| 亚洲精品伊人| 国产毛片一区二区三区| 精品日产乱码久久久久久仙踪林| 91视频久久| 2023国产精品久久久精品双| 久久亚洲一区| 国产探花在线精品| 福利一区二区三区视频在线观看| 日韩精品一区二区三区免费观看| 黄色av日韩| 日韩毛片一区| 免费看一区二区三区| 亚洲永久av| 国产亚洲网站| 国产亚洲精aa在线看| 久久久久久夜| 伊人久久亚洲美女图片| 亚洲tv在线| 久久免费精品| 免费观看久久av| 亚洲综合色婷婷在线观看| 国产乱人伦丫前精品视频| 91亚洲一区| 日韩在线一区二区| 欧美激情亚洲| 在线视频观看日韩| 日韩精品免费视频一区二区三区| 精品国产精品久久一区免费式| 欧美精品一区二区三区精品| 欧美午夜不卡| 日韩中出av| а√天堂8资源中文在线| 精品午夜av| 欧美成人a交片免费看| 国产精品av久久久久久麻豆网| 啪啪国产精品| 99riav国产精品| 中文字幕日韩欧美精品高清在线| 欧美一区二区三区久久| 精品国产网站| 国产综合婷婷| 婷婷综合电影| 九九九精品视频| 激情综合激情| 亚洲深夜福利| 日韩av网站在线观看| 久久久久97| 激情婷婷综合| 国产探花一区| 三级在线看中文字幕完整版| 亚洲精品在线二区| bbw在线视频| 亚久久调教视频| 日韩在线短视频| 日韩不卡一二三区| 激情婷婷欧美| 国产成年精品| 亚洲97av| 久久精品导航| 国产精品美女午夜爽爽| 99国内精品| 日韩在线观看| 欧美专区一区| 免费久久99精品国产自在现线| 国产91在线精品| 日韩国产在线观看一区| 久久麻豆精品| 久久精品国产免费| 午夜亚洲福利| 一区免费视频| а√天堂8资源中文在线| 久久国产日韩欧美精品| 欧美日韩精品免费观看视频完整| 国产一区二区亚洲| 91国内精品| 欧美日韩国产一区二区三区不卡| 精品理论电影在线| 欧美亚洲一区二区三区| 爽好多水快深点欧美视频| 亚洲福利精品| 国产乱码午夜在线视频| 国产欧美日韩免费观看|