最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解JavaScript中的宏任務(wù)和微任務(wù)機(jī)制

 更新時間:2023年05月05日 09:01:53   作者:火木火木  
JavaScript中的任務(wù)分為宏任務(wù)和微任務(wù),它們的執(zhí)行順序會影響代碼的執(zhí)行結(jié)果。了解它們的機(jī)制可以幫助我們更好地理解事件循環(huán)和異步編程,避免出現(xiàn)一些意想不到的錯誤

引入

// 開啟一個定時器 1秒后執(zhí)行
setTimeout( () => {
    console.log(1)
}, 1000)
console.log(2)

以上的代碼控制臺的輸出結(jié)果是“ 2,1";即先輸出2再輸出1;先執(zhí)行的是打印”2“的內(nèi)容,再執(zhí)行定時器中1秒之后打印”1"的內(nèi)容;

// 開啟一個定時器 1秒后執(zhí)行
setTimeout( () => {
    console.log(1)
}, 0)
console.log(2)

將定時器中的時間改為0,即立即觸發(fā),代碼控制臺的輸出結(jié)果仍然為"2, 1";定時器的作用是間隔一段時間后,將函數(shù)放入到任務(wù)隊列中,而 ”console.log(2)“則是直接在調(diào)用棧中執(zhí)行,執(zhí)行完畢了,消息隊列中的定時器才會進(jìn)入到調(diào)用棧中執(zhí)行代碼

宏任務(wù)與微任務(wù)

宏任務(wù)隊列

微任務(wù)隊列

棧與調(diào)用棧

JS是單線程的,它的運行是基于時間循環(huán)機(jī)制(event loop)

調(diào)用棧

棧是一種數(shù)據(jù)結(jié)構(gòu),后進(jìn)先出(l類比于彈夾中的子彈最后壓進(jìn)最先射出)

調(diào)用棧中,放的是要執(zhí)行的代碼

執(zhí)行的代碼在棧中從上到下依次執(zhí)行(上面的是左后進(jìn)去的,所以最先執(zhí)行)

消息隊列(任務(wù)隊列)

隊列 隊列是一種數(shù)據(jù)結(jié)構(gòu),先進(jìn)先出(類比于排隊打飯,排前面的先打)

隊列中,放的是將要執(zhí)行的代碼

當(dāng)調(diào)用棧中的代碼執(zhí)行完畢后,隊列中的代碼按照順序依次進(jìn)入到調(diào)用棧中執(zhí)行

在JS中任務(wù)隊列有兩種

宏任務(wù)隊列

大部分代碼都去宏任務(wù)隊列中排隊

微任務(wù)隊列

Promise的回調(diào)函數(shù)(then、catch、finally)在微任務(wù)隊列中排隊

整個流程

  • 執(zhí)行調(diào)用棧中的代碼
  • 執(zhí)行微任務(wù)中的所有任務(wù)
  • 執(zhí)行宏任務(wù)中的所有任務(wù)
// 開啟一個定時器 1秒后執(zhí)行
setTimeout( () => {
    console.log(1)
}, 0)
Promise.resolve(1).then(() => {
    console.log(2)
})
//全局作用域的代碼一定是位于棧中的
console.log(3)

上述代碼的執(zhí)行結(jié)果是”3 2 1“;打印"3”的語句是位于全局作用域中,一定是位于調(diào)用棧中的,所以最先執(zhí)行,

Promise的執(zhí)行原理

  • Promise在執(zhí)行時,then就相當(dāng)于給Promise了回調(diào)函數(shù)
  • 當(dāng)promnise的狀態(tài)從pending 變?yōu)?fulfilled時,then的回調(diào)函數(shù)會被放入任務(wù)隊列中

queueMicrotask() 用來向微任務(wù)隊列中添加一個任務(wù)

// 開啟一個定時器 1秒后執(zhí)行,在宏任務(wù)隊列中等待
setTimeout( () => {
    console.log(1)
}, 0)
// 在微任務(wù)隊列中等待
Promise.resolve(1).then(() => {
    console.log(2)
})
// 在為任務(wù)隊列中
Promise.resolve().then(()=> {
    console.log(3)
})

執(zhí)行結(jié)果是“2 3 1”;首先“2”和“3"是放在微任務(wù)中的,”1“是放在宏任務(wù)中,先執(zhí)行的應(yīng)該是微任務(wù)中的,隊列中遵循“先進(jìn)先出”,“2"先進(jìn)所以先出到調(diào)用棧中運行,然后是”3“,最后是宏任務(wù)中的"1"

// 在微任務(wù)隊列中等待
Promise.resolve(1).then(() => {
    setTimeout( () => {
        console.log(1)
    }, 0)
})
// 在為任務(wù)隊列中
Promise.resolve().then(()=> {
    console.log(3)
})

執(zhí)行的結(jié)果是”3 1”;定時器的外層雖然是放在微任務(wù)的中,外層的Promise先執(zhí)行,但由于內(nèi)部有定時器隨后進(jìn)入了宏任務(wù),所以下面的“3”處于微任務(wù)中就直接進(jìn)入調(diào)用棧執(zhí)行了,所以執(zhí)行的結(jié)果為“31"

到此這篇關(guān)于深入理解JavaScript中的宏任務(wù)和微任務(wù)機(jī)制的文章就介紹到這了,更多相關(guān)JS中的宏任務(wù)和微任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript異步隊列進(jìn)行try?catch時的問題解決

    JavaScript異步隊列進(jìn)行try?catch時的問題解決

    這篇文章主要介紹了JavaScript異步隊列進(jìn)行try?catch時的問題解決,文章圍繞主題展開詳細(xì)的的相關(guān)內(nèi)容介紹,需要的朋友可以參考一下
    2022-07-07
  • JS 事件延遲執(zhí)行說明分析

    JS 事件延遲執(zhí)行說明分析

    為了避免用戶鼠標(biāo)無意識劃過,而觸發(fā)事件。浪費客戶端資源。
    2010-05-05
  • antd項目實現(xiàn)彩蛋效果的詳細(xì)代碼

    antd項目實現(xiàn)彩蛋效果的詳細(xì)代碼

    這篇文章主要介紹了antd項目如何實現(xiàn)彩蛋效果,首先在components目錄下創(chuàng)建Transform目錄,包括index.css、index.js,index.js是主要的邏輯代碼,下面對代碼進(jìn)行分析,需要的朋友可以參考下
    2022-09-09
  • JavaScript錯誤處理避坑指南

    JavaScript錯誤處理避坑指南

    JavaScript錯誤處理是編程過程中不可避免的部分,它涉及到識別、捕獲和響應(yīng)代碼運行時可能出現(xiàn)的問題,本文將詳細(xì)給大家介紹一下JavaScript錯誤處理的避坑指南,需要的朋友可以參考下
    2025-03-03
  • KnockoutJS 3.X API 第四章之事件event綁定

    KnockoutJS 3.X API 第四章之事件event綁定

    event綁定即為事件綁定,即當(dāng)觸發(fā)相關(guān)DOM事件的時候回調(diào)函數(shù),這篇文章主要介紹了KnockoutJS 3.X API 第四章之事件event綁定的相關(guān)知識,感興趣的朋友一起看看吧
    2016-10-10
  • JS實現(xiàn)隨機(jī)亂撞彩色圓球特效的方法

    JS實現(xiàn)隨機(jī)亂撞彩色圓球特效的方法

    這篇文章主要介紹了JS實現(xiàn)隨機(jī)亂撞彩色圓球特效的方法,可實現(xiàn)彩色小球的碰撞效果,涉及隨機(jī)函數(shù)與頁面樣式的操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • js實現(xiàn)登陸與注冊功能

    js實現(xiàn)登陸與注冊功能

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)登陸與注冊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 微信小程序 引入es6 promise

    微信小程序 引入es6 promise

    本篇文章主要介紹了微信小程序引入es6 promise的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • 淺析JavaScript中瀏覽器的兼容問題

    淺析JavaScript中瀏覽器的兼容問題

    下面小編就為大家?guī)硪黄獪\析JavaScript中瀏覽器的兼容問題。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-04-04
  • video.js使用改變ui過程

    video.js使用改變ui過程

    這篇文章主要介紹了video.js使用改變ui的過程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03

最新評論

定陶县| 呼和浩特市| 富顺县| 色达县| 榕江县| 沧源| 洪雅县| 广宗县| 松原市| 屏山县| 湖南省| 济南市| 蒲城县| 德保县| 永兴县| 兰州市| 清水县| 丰镇市| 西宁市| 潮州市| 汉中市| 高阳县| 台山市| 赤水市| 怀安县| 丹巴县| 韩城市| 仪征市| 抚宁县| 华亭县| 如皋市| 陆良县| 泰州市| 谢通门县| 象山县| 张北县| 荥阳市| 水富县| 民勤县| 襄樊市| 凭祥市|