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

深入理解JS中的微任務(wù)和宏任務(wù)的執(zhí)行順序及應(yīng)用場(chǎng)景

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

微任務(wù)和宏任務(wù)的區(qū)別及具體場(chǎng)景

微任務(wù)和宏任務(wù)皆為異步任務(wù),它們都屬于一個(gè)隊(duì)列,主要區(qū)別在于他們的執(zhí)行順序,Event Loop的走向和取值。

任務(wù)之間的一些劃分

概念

1.宏觀任務(wù):當(dāng)前調(diào)用棧中執(zhí)行的代碼成為宏任務(wù)。(主代碼塊、setTimeout、setInterval、I/O、UI 交互事件、setImmediate等等)。

2.微觀任務(wù): 當(dāng)前(此次事件循環(huán)中)宏任務(wù)執(zhí)行完,在下一個(gè)宏任務(wù)開始之前需要執(zhí)行的任務(wù),可以理解為回調(diào)事件。(Promise.then、MutaionObserver、process.nextTick等等)。

3.宏任務(wù)中的事件放在callback queue中,由事件觸發(fā)線程維護(hù);微任務(wù)的事件放在微任務(wù)隊(duì)列中,由js引擎線程維護(hù)。

任務(wù)之間的執(zhí)行順序

宏任務(wù)與微任務(wù)之間的執(zhí)行順序(同步任務(wù)->微任務(wù)->宏任務(wù))

到這里,必須得用代碼來舉個(gè)例子??給大家展示展示了。

// 代碼塊1
setTimeout(function() {   //宏任務(wù)1
  console.log('1');
});
new Promise(function(resolve) {
  console.log('2'); //同步任務(wù)1
  resolve();
}).then(function() {   //微任務(wù)1
  console.log('3');
});
console.log('4'); //同步任務(wù)2
// 代碼塊2
setTimeout(function() {   //宏任務(wù)2
  console.log('5'); //宏任務(wù)2中的同步任務(wù)
  new Promise(function(resolve) {
    console.log('6'); //宏任務(wù)2中的同步任務(wù)
    new Promise(function(resolve) {      //宏任務(wù)2中的微任務(wù)
      console.log('x1');
      resolve();
    }).then(function() {
      console.log('X2');
    });
    setTimeout(function() {       //宏任務(wù)2中的宏任務(wù)
      console.log('X3');
      new Promise(function(resolve) {         //宏任務(wù)2中的宏任務(wù)中的同步任務(wù)
        console.log('X4');
        resolve();
      }).then(function() {        //宏任務(wù)2中的宏任務(wù)中的微任務(wù)
        console.log('X5');
      });
    });
    resolve();
  }).then(function() {    //宏任務(wù)2中的微任務(wù)
    console.log('7');
  });
});
// 代碼塊3
setTimeout(function() {  //宏任務(wù)3
  console.log('8');
});
//(對(duì)于這段代碼node環(huán)境和瀏覽器環(huán)境輸出一致)
//輸出答案:2,4,3,1,5,6,x1,x2,7,8,x3,x4,x5

運(yùn)行完結(jié)果,機(jī)智寶寶難免會(huì)想為什么答案會(huì)是這樣的呢,按照同步任務(wù)->微任務(wù)->宏任務(wù)的執(zhí)行順序去檢查,會(huì)慢慢深入人心的。

比較難理解的應(yīng)該是代碼塊2,同步執(zhí)行的按順序執(zhí)行就好了,在輸出同步任務(wù)X1,輸出微任務(wù)X2后,因?yàn)閟etTimeout又是一個(gè)宏任務(wù),所以會(huì)被排到所有的宏任務(wù)之后,所以就會(huì)在7,8的后面出現(xiàn)打印。

那我們?cè)?宏任務(wù)2中的宏任務(wù) X3,X4,X5后面再添加一個(gè)宏任務(wù),最終的結(jié)果會(huì)排列到后面執(zhí)行

setTimeout(function() {   //宏任務(wù)2
  console.log('5'); //宏任務(wù)2中的同步任務(wù)
  new Promise(function(resolve) {
    console.log('6'); //宏任務(wù)2中的同步任務(wù)
    new Promise(function(resolve) {      //宏任務(wù)2中的微任務(wù)
      console.log('x1');
      resolve();
    }).then(function() {
      console.log('X2');
    });
    setTimeout(function() {       //宏任務(wù)2中的宏任務(wù)
      console.log('X3');
      new Promise(function(resolve) {         //宏任務(wù)2中的宏任務(wù)中的同步任務(wù)
        console.log('X4');
        resolve();
      }).then(function() {        //宏任務(wù)2中的宏任務(wù)中的微任務(wù)
        console.log('X5');
      });
    });
   setTimeout(function() {       //宏任務(wù)2中的宏任務(wù)
      console.log('X6');
      new Promise(function(resolve) {         //宏任務(wù)2中的宏任務(wù)中的同步任務(wù)
        console.log('X7');
        resolve();
      }).then(function() {        //宏任務(wù)2中的宏任務(wù)中的微任務(wù)
        console.log('X8');
      });
    });
    resolve();
  }).then(function() {    //宏任務(wù)2中的微任務(wù)
    console.log('7');
  });
});
// 5,6,X1,X27,X3,X4,X5,X6,X7,X8

到此這篇關(guān)于深入理解JS中的微任務(wù)和宏任務(wù)的執(zhí)行順序及應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)JS中的微任務(wù)和宏任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS顯示下拉列表框內(nèi)全部元素的方法

    JS顯示下拉列表框內(nèi)全部元素的方法

    這篇文章主要介紹了JS顯示下拉列表框內(nèi)全部元素的方法,涉及javascript遍歷下拉列表元素的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • 微信小程序?qū)崿F(xiàn)滑動(dòng)翻頁效果(完整代碼)

    微信小程序?qū)崿F(xiàn)滑動(dòng)翻頁效果(完整代碼)

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)滑動(dòng)翻頁效果,本文通過效果圖展示實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JS將網(wǎng)址url轉(zhuǎn)化為JSON格式的方法

    JS將網(wǎng)址url轉(zhuǎn)化為JSON格式的方法

    這篇文章主要介紹了JS將網(wǎng)址url轉(zhuǎn)化為JSON格式的方法,需要的朋友可以參考下
    2018-07-07
  • JS中如何實(shí)現(xiàn)Laravel的route函數(shù)詳解

    JS中如何實(shí)現(xiàn)Laravel的route函數(shù)詳解

    這篇文章主要給大家介紹了JS中是如何實(shí)現(xiàn)Laravel的route函數(shù),文中通過示例代碼介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • JavaScript使用readAsDataUrl方法預(yù)覽圖片

    JavaScript使用readAsDataUrl方法預(yù)覽圖片

    這篇文章主要為大家詳細(xì)介紹了JavaScript使用readAsDataUrl方法預(yù)覽圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • JavaScript中的concat()方法的用法詳解

    JavaScript中的concat()方法的用法詳解

    在?JavaScript?中,數(shù)組和字符串都是常用的數(shù)據(jù)結(jié)構(gòu),在實(shí)際開發(fā)中,操作數(shù)組和字符串是非常頻繁的任務(wù),concat()?方法就是用于合并數(shù)組或字符串的一種常見方法,在本文中,我們將詳細(xì)探討?concat()?方法的用法和示例,需要的朋友可以參考下
    2024-11-11
  • js中方法重載如何實(shí)現(xiàn)?以及函數(shù)的參數(shù)問題

    js中方法重載如何實(shí)現(xiàn)?以及函數(shù)的參數(shù)問題

    js中沒有辦法直接實(shí)現(xiàn)方法重載,但每一個(gè)函數(shù)都有一個(gè)特殊的參數(shù)arguments,利用它可以實(shí)現(xiàn)方法的重載,具體示例如下
    2013-08-08
  • ES6(ECMAScript 6)新特性之模板字符串用法分析

    ES6(ECMAScript 6)新特性之模板字符串用法分析

    這篇文章主要介紹了ES6(ECMAScript 6)新特性之模板字符串用法,簡(jiǎn)單介紹了ES6模板字符串的概念、功能并結(jié)合實(shí)例形式分析了ES6模板字符串的用法,需要的朋友可以參考下
    2017-04-04
  • highlight.js 代碼高亮插件的使用詳解

    highlight.js 代碼高亮插件的使用詳解

    在網(wǎng)頁使用過程中,經(jīng)常會(huì)用到代碼的展示。代碼高亮可以直觀的了解代碼,本文主要介紹了highlight.js 代碼高亮插件的使用詳解,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • JS原型繼承四步曲及原型繼承圖一覽

    JS原型繼承四步曲及原型繼承圖一覽

    下面小編就為大家分享一篇JS原型繼承四步曲及原型繼承圖一覽,具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11

最新評(píng)論

当涂县| 邯郸市| 永和县| 上杭县| 万盛区| 海口市| 恩施市| 台州市| 昌宁县| 凤台县| 平凉市| 雷波县| 菏泽市| 阿克陶县| 菏泽市| 石屏县| 保康县| 玉屏| 高陵县| 崇礼县| 青州市| 成武县| 四子王旗| 高青县| 定安县| 龙游县| 阜宁县| 衡山县| 襄樊市| 伊金霍洛旗| 紫阳县| 昌平区| 始兴县| 聊城市| 鄱阳县| 米泉市| 康马县| 吴川市| 临夏县| 贵州省| 都兰县|