在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當(dāng)前位置:雨林木風(fēng)下載站 > 網(wǎng)頁(yè)設(shè)計(jì)教程 > 詳細(xì)頁(yè)面

瀏覽器事件循環(huán)的深入知道(代碼示例)

瀏覽器事件循環(huán)的深入知道(代碼示例)

更新時(shí)間:2025-12-09 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

導(dǎo)網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立...
網(wǎng)頁(yè)的本質(zhì)就是超級(jí)文本標(biāo)記語(yǔ)言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語(yǔ)言、公共網(wǎng)關(guān)接口、組件等),可以創(chuàng)造出功能強(qiáng)大的網(wǎng)頁(yè)。因而,超級(jí)文本標(biāo)記語(yǔ)言是萬(wàn)維網(wǎng)(Web)編程的基礎(chǔ),也就是說(shuō)萬(wàn)維網(wǎng)是建立在超文本基礎(chǔ)之上的。超級(jí)文本標(biāo)記語(yǔ)言之所以稱為超文本標(biāo)記語(yǔ)言,是因?yàn)槲谋局邪怂^“超級(jí)鏈接”點(diǎn)。
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于瀏覽器事件循環(huán)的深入了解(代碼示例),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

瀏覽器的事件循環(huán),前端再熟悉不過了,每天都會(huì)接觸的東西。但我以前一直都是死記硬背:事件任務(wù)隊(duì)列分為macrotask和microtask,瀏覽器先從macrotask取出一個(gè)任務(wù)執(zhí)行,再執(zhí)行microtask內(nèi)的所有任務(wù),接著又去macrotask取出一個(gè)任務(wù)執(zhí)行...,這樣一直循環(huán)下去。但是對(duì)于下面的代碼,我一直懵逼,setTimeout屬于macrotask,按照上面的規(guī)則,setTimeout應(yīng)該先被取出來(lái)執(zhí)行啊,但是我卻被執(zhí)行結(jié)果打臉了。

<script>
    setTimeout(() => {
        console.log(1)
    }, 0)
    new Promise((resolve) => {
        console.log(2)
        resolve()
    }).then(() => {
        console.log(3)
    })
    // 我曾經(jīng)的預(yù)期是:2 1 3
    // 實(shí)際輸出:2 3 1
</script>

經(jīng)過再仔細(xì)看別人對(duì)任務(wù)隊(duì)列的介紹,才知道,同步執(zhí)行的js代碼其實(shí)就算一個(gè)macrotask(準(zhǔn)確說(shuō)是每一個(gè)script標(biāo)簽內(nèi)的代碼都是一個(gè)macrotask),所以上面的規(guī)則中說(shuō)的 先取出一個(gè)macrotask執(zhí)行 是沒有問題的。
網(wǎng)上很多文章都是像上面這樣解釋的,我也一直認(rèn)為這是HTML對(duì)事件循環(huán)的規(guī)范,我們記著就是。直到最近看了李銀城大佬的文章(見文末的參考鏈接),我才恍然大悟,之前看的文章都沒有明確地從瀏覽器的多線程模型這個(gè)角度分析,所以讓我們覺得瀏覽器的事件循環(huán)是基于上述的約定,但其實(shí)這是瀏覽器的多線程模型導(dǎo)致的結(jié)果。

macrotask的本質(zhì)

macrotask本質(zhì)上是瀏覽器多個(gè)線程之間通信的一個(gè)消息隊(duì)列
在chrome里,每個(gè)頁(yè)面都對(duì)應(yīng)一個(gè)進(jìn)程,該進(jìn)程又有多個(gè)線程,比如js線程、渲染線程、io線程、網(wǎng)絡(luò)線程、定時(shí)器線程等,這些線程之間的通信,是通過向?qū)Ψ降娜蝿?wù)隊(duì)列中添加一個(gè)任務(wù)(PostTask)來(lái)實(shí)現(xiàn)的。

瀏覽器的各種線程都是常駐線程,它們運(yùn)行在一個(gè)for死循環(huán)里面,每個(gè)線程都有屬于自己的若干任務(wù)隊(duì)列,線程自己或者其它線程都可能通過PostTask向這些任務(wù)隊(duì)列添加任務(wù),這些線程會(huì)不斷地從自己的任務(wù)隊(duì)列中取出任務(wù)執(zhí)行,或者是處于睡眠狀態(tài)直到設(shè)定的時(shí)間或者是有人PostTask的時(shí)候把它們喚醒。

可以簡(jiǎn)單地理解為,瀏覽器的各個(gè)線程都在不停地從自己的任務(wù)隊(duì)列中取出任務(wù),執(zhí)行,再取出任務(wù),再執(zhí)行,這樣無(wú)限循環(huán)下去。

以下面的代碼為例:

<script>
    console.log(1)
    setTimeout(() => {
        console.log(2)
    }, 1000)
    console.log(3)
</script>
  1. 首先,script標(biāo)簽中的代碼作為一個(gè)任務(wù)放入js線程的任務(wù)隊(duì)列,js線程被喚醒,然后取出該任務(wù)執(zhí)行

  2. 首先執(zhí)行console.log(1),然后執(zhí)行setTimeout,向定時(shí)器線程添加一個(gè)任務(wù),接著執(zhí)行console.log(3),這時(shí)js線程的任務(wù)隊(duì)列為空,js線程進(jìn)入休眠

  3. 大約1000ms后,定時(shí)器線程向js線程的任務(wù)隊(duì)列添加定時(shí)任務(wù)(定時(shí)器的回調(diào)),js線程又被喚醒,執(zhí)行定時(shí)回調(diào)函數(shù),最后執(zhí)行console.log(2)。

可以看到,所謂的macrotask并不是瀏覽器定義了哪些任務(wù)是macrotask,瀏覽器各個(gè)線程只是忠實(shí)地循環(huán)自己的任務(wù)隊(duì)列,不停地執(zhí)行其中的任務(wù)而已。

microtask

比起macrotask是瀏覽器的多線程模型造成的“假象”,microtask是確實(shí)存在的一個(gè)隊(duì)列,microtask是屬于當(dāng)前線程的,而不是其他線程PostTask過來(lái)的任務(wù),只是延遲執(zhí)行了而已(準(zhǔn)確地說(shuō)是放到了當(dāng)前執(zhí)行的同步代碼之后執(zhí)行),比如Promise.then、MutationObserver都屬于這種情況。

以下面的代碼為例:

<script>
    new Promise((resolve) => {
       resolve()
       console.log(1)
       setTimeout(() => {
         console.log(2)
       },0)
    }).then(() => {
        console.log(3)
    })
    // 輸出:1 3 2
</script>
  1. 首先,script標(biāo)簽中的代碼作為一個(gè)任務(wù)放入js線程的任務(wù)隊(duì)列,js線程被喚醒,然后取出該任務(wù)執(zhí)行

  2. 然后執(zhí)行new Promise以及Promise中的resolve,resolve后,promise的then的回調(diào)函數(shù)會(huì)作為需要延遲執(zhí)行的任務(wù),放到當(dāng)前執(zhí)行的所有同步代碼之后

  3. 接著執(zhí)行setTimeout,向定時(shí)器線程添加一個(gè)任務(wù)

  4. 此時(shí)同步代碼執(zhí)行完畢,接著執(zhí)行被延遲執(zhí)行的任務(wù),也就是promise的then的回調(diào)函數(shù),即執(zhí)行console.log(3)

  5. 最后,js線程的任務(wù)隊(duì)列為空,js線程進(jìn)入休眠,大約1000ms后,定時(shí)器線程向js線程的任務(wù)隊(duì)列添加定時(shí)任務(wù)(定時(shí)器的回調(diào)),js線程又被喚醒,執(zhí)行定時(shí)回調(diào)函數(shù),即console.log(2)。

總結(jié)

通過上面的分析,可以看到,文章開頭提到的規(guī)則:瀏覽器先從macrotask取出一個(gè)任務(wù)執(zhí)行,再執(zhí)行microtask內(nèi)的所有任務(wù),接著又去macrotask取出一個(gè)任務(wù)執(zhí)行...,并沒有說(shuō)錯(cuò),但這只是瀏覽器執(zhí)行機(jī)制造成的現(xiàn)象,而不是說(shuō)瀏覽器按照這樣的規(guī)則去執(zhí)行的代碼。
這篇文章中的所有干貨都來(lái)自李銀成大佬的文章,我只是按照自己的理解,做了簡(jiǎn)化描述,方便大家理解,也加深自己的印象。
最后,看了這篇文章,大家能夠基于瀏覽器的運(yùn)行機(jī)制,分析出下面代碼的執(zhí)行結(jié)果了嗎(ps:不要用死記硬背的規(guī)則去分析喲)

console.log('start')

const interval = setInterval(() => {  
  console.log('setInterval')
}, 0)

setTimeout(() => {  
  console.log('setTimeout 1')
  Promise.resolve()
      .then(() => {
        console.log('promise 3')
      })
      .then(() => {
        console.log('promise 4')
      })
      .then(() => {
        setTimeout(() => {
          console.log('setTimeout 2')
          Promise.resolve()
              .then(() => {
                console.log('promise 5')
              })
              .then(() => {
                console.log('promise 6')
              })
              .then(() => {
                clearInterval(interval)
              })
        }, 0)
      })
}, 0)

Promise.resolve()
    .then(() => {  
        console.log('promise 1')
    })
    .then(() => {
        console.log('promise 2')
    })
// 執(zhí)行結(jié)果
/*  start
    promise 1
    promise 2
    setInterval
    setTimeout 1
    promise 3
    promise 4
    setInterval
    setTimeout 2
    promise 5
    promise 6
*/

以上就是瀏覽器事件循環(huán)的深入了解(代碼示例)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


網(wǎng)站建設(shè)是一個(gè)廣義的術(shù)語(yǔ),涵蓋了許多不同的技能和學(xué)科中所使用的生產(chǎn)和維護(hù)的網(wǎng)站。

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 欧美成人精品免费| 欧美激情 国产精品| 冲田杏梨av在线| 国产成人无码a区在线观看视频| 国产又粗又猛大又黄又爽| 日本999视频| 亚洲综合在线网站| 国产视频一区二区视频| 精品www久久久久奶水| 成人小视频在线看| 国产一区视频免费观看| 91日韩视频在线观看| 91国产精品视频在线观看| 精品久久久久久中文字幕2017| 激情婷婷综合网| 午夜免费高清视频| 超碰在线资源站| 男人日女人的bb| 亚洲熟妇av日韩熟妇在线| 免费看又黄又无码的网站| 亚洲熟妇av一区二区三区漫画| 日韩网址在线观看| 911福利视频| 天天做天天爱天天高潮| 菠萝蜜视频在线观看入口| 国产成人在线小视频| 91猫先生在线| jizzzz日本| 欧美视频在线第一页| 久久久免费视频网站| 日日噜噜噜噜久久久精品毛片| 亚洲综合123| 日本十八禁视频无遮挡| 亚洲黄色av网址| 亚洲精品天堂成人片av在线播放| 日韩少妇内射免费播放18禁裸乳| 狠狠操狠狠干视频| 国产精品免费看久久久无码| 免费高清在线观看免费| 永久免费黄色片| aa视频在线播放| 亚洲激情在线看| 国产九九九九九| 久久精品一卡二卡| 不卡影院一区二区| 欧美高清中文字幕| 爱情岛论坛亚洲首页入口章节| 日本精品福利视频| 污网站在线免费| 国产乱子伦农村叉叉叉| 无套内谢丰满少妇中文字幕| 精品人妻一区二区三区四区在线 | 日韩亚洲在线视频| 波多野结衣 作品| 午夜免费一级片| 九色porny91| 日韩精品视频一区二区在线观看| 丰满女人性猛交| 亚洲小视频网站| www.xxx亚洲| 日av中文字幕| 日韩免费毛片视频| 久草精品在线播放| 国产在线精品91| 无码人妻少妇伦在线电影| 先锋影音男人资源| 国产免费色视频| 中文字幕超清在线免费观看| 91制片厂毛片| www.国产视频.com| 久久国产激情视频| 中文 日韩 欧美| 日韩av片免费观看| www.午夜色| 欧美性受xxxx黑人猛交88| 中文国产在线观看| av不卡在线免费观看| 黄瓜视频免费观看在线观看www| av中文字幕网址| www.色.com| www.xxx麻豆| 内射国产内射夫妻免费频道| 日批视频在线免费看| 男人操女人免费| 超碰人人草人人| 日本精品福利视频| 国产免费一区二区三区视频| 日韩中文字幕免费在线| 久久婷婷综合色| 黄瓜视频免费观看在线观看www | 樱空桃在线播放| r级无码视频在线观看| 欧美爱爱视频免费看| 日本新janpanese乱熟| 日本在线播放一区二区| 日本中文字幕一级片| 亚洲人成无码www久久久| 97超碰人人爽| 黄色一级片在线看| 中文字幕视频在线免费观看| 美国av在线播放| 日韩视频第二页| 久久免费视频2| 黄色a级片免费| 日韩免费在线观看av| xxx国产在线观看| 少妇高潮毛片色欲ava片| 亚洲va综合va国产va中文| 亚洲av首页在线| 成年人免费在线播放| 樱空桃在线播放| 国产成人av影视| 青草青青在线视频| 国产又爽又黄ai换脸| 成人黄色片视频| 日韩精品在线观看av| 亚洲五月激情网| 无码人妻精品一区二区三区66| 青青草综合视频| 中文国产在线观看| 午夜免费一区二区| 日韩精品一区二区三区久久| 日本黄xxxxxxxxx100| 天天操天天干天天做| 青青草精品视频在线观看| 三上悠亚久久精品| 香蕉视频免费版| www亚洲国产| 亚洲黄色片免费看| 亚洲欧美激情网| 国产成人手机视频| 日韩 欧美 高清| 日本在线视频www| aa免费在线观看| 欧美性久久久久| 中文字幕无码精品亚洲35| 激情五月婷婷六月| 成人区一区二区| 欧美中日韩在线| 野外做受又硬又粗又大视频√| 无码人妻aⅴ一区二区三区日本| 三级一区二区三区| 三级av免费看| 法国空姐在线观看免费| 韩国无码av片在线观看网站| 日韩成人三级视频| 亚洲熟妇无码av在线播放| 成年人午夜免费视频| 日韩a∨精品日韩在线观看| 18禁裸男晨勃露j毛免费观看| 成人午夜视频免费观看| 国产96在线 | 亚洲| aaa毛片在线观看| 国产精品自在自线| www.黄色网址.com| 免费看国产一级片| 亚洲性生活网站| 99热一区二区三区| av女优在线播放| 北条麻妃av高潮尖叫在线观看| 亚洲福利精品视频| 一二三四中文字幕| 大肉大捧一进一出好爽视频| 嫩草av久久伊人妇女超级a| 天堂av在线8| 久久精品国产sm调教网站演员| 国产成人无码一二三区视频| 亚洲免费av一区| 男人日女人逼逼| 992kp免费看片| 欧美在线观看成人| 992tv成人免费观看| 国产精品丝袜久久久久久消防器材| 欧美成人福利在线观看| 日本免费a视频| 中文字幕av不卡在线| 欧美这里只有精品| 国产3p在线播放| 凹凸日日摸日日碰夜夜爽1| 在线观看成人免费| 三上悠亚av一区二区三区| 波多野结衣av一区二区全免费观看| 一路向西2在线观看| 亚洲国产精品无码观看久久| 精品国产乱码久久久久久1区二区| 老太脱裤子让老头玩xxxxx| 91欧美一区二区三区| 欧美日韩怡红院| 免费av观看网址| 久久综合久久网| 黄色一级片av| 国产又大又长又粗又黄| 伊人网在线综合| 亚洲精品午夜在线观看| aa免费在线观看| www.亚洲天堂网| 青青草原av在线播放| 男女猛烈激情xx00免费视频| 今天免费高清在线观看国语| 香蕉视频色在线观看|