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

JavaScript宏任務(wù)(macrotask)和微任務(wù)(microtask) 執(zhí)行順序?qū)嵗斀?/h1>
 更新時(shí)間:2023年10月09日 10:44:54   作者:奧特曼  
JavaScript是單線程指的是同一時(shí)間只能干一件事情,只有前面的事情執(zhí)行完,才能執(zhí)行后面的事情,這篇文章主要介紹了JavaScript宏任務(wù)(macrotask)和 微任務(wù)(microtask) 執(zhí)行順序,需要的朋友可以參考下

一、JavaScript單線程

JavaScript是單線程指的是同一時(shí)間只能干一件事情,只有前面的事情執(zhí)行完,才能執(zhí)行后面的事情。導(dǎo)致遇到耗時(shí)的任務(wù)時(shí)后面的代碼無法執(zhí)行。

在此之前啊 我們必須了解同步和異步 

1. 同步任務(wù)(synchronous) 

    console.log(123);
    console.log(456);
    for (let i = 1; i <= 5; i++) {
      console.log(i);
    }

顧名思義 得到的一定是 順序執(zhí)行 

 2. 異步任務(wù)(asynchronous)

    setTimeout(() => {
      console.log('定時(shí)器');
    }, 0)
    console.log('奧特曼');

按普通的執(zhí)行順序來說 定時(shí)器在上面  應(yīng)該先輸出定時(shí)器 在輸出 奧特曼  

   最后拿到的結(jié)果卻先輸出奧特曼 在輸出了定時(shí)器  原因呢就是 setTimeout是異步任務(wù)  

補(bǔ)充一個(gè)知識(shí)點(diǎn)  setTimeout的定時(shí)器 不管延遲多少毫秒 也是異步的  每個(gè)瀏覽器的時(shí)間也是不同的,各個(gè)瀏覽器都有差異 但定義了0 最小也是4毫秒

二、任務(wù)隊(duì)列(task queue)

通過上面代碼知道setTimeout是異步的   我們就搞清了執(zhí)行順序優(yōu)先級(jí)  同步代碼>異步代碼      所以說 在任務(wù)隊(duì)列中 分為兩大類 1.同步任務(wù)   2. 異步任務(wù) 

1.執(zhí)行棧

(1)所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。

(2)主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。

(3)一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開始執(zhí)行。

(4)主線程不斷重復(fù)上面的第三步,稱為事件循環(huán)(Event Loop)。

簡(jiǎn)單舉個(gè)梨子    

同樣都是去吃飯  但是p2 省去了出去的時(shí)間過程

簡(jiǎn)單了解后 我們?cè)賮砩钊肓私?異步任務(wù)中的 宏任務(wù)(macrotask )和 微任務(wù)(microtask )

個(gè)人理解: 對(duì)于宏任務(wù)和微任務(wù) 可以理解為兩種異步的形態(tài),  異步有兩個(gè)孩子 宏任務(wù) 和 微任務(wù)

宏任務(wù)中的方法:1. script (可以理解為外層同步代碼,作為入口 )   2. setTimeout/setInterval

微任務(wù)中的方法:1.Promise 2. nextTick

而他們的執(zhí)行順序 是 微任務(wù) 先輸出 在輸出 宏任務(wù)

口說無憑 上代碼

    setTimeout(() => {
      console.log('定時(shí)器');
    }, 0)
    new Promise((resolve) => {
      console.log('同步代碼')  
      resolve('異步代碼')
    }).then((res) => {
      console.log(res);   
    })
    console.log('奧特曼');

  注意奧 new Promise是創(chuàng)建一個(gè)構(gòu)造函數(shù) 這個(gè)過程是同步的,而.then方法是異步的  所以代碼先執(zhí)行 同步>微任務(wù)>宏任務(wù)

為了更加詳細(xì) 用圖來描述執(zhí)行過程   下面的圖有一丁丁大 學(xué)習(xí)不怕費(fèi)流量哦

這些圖在融合一下

擴(kuò)展一下setTimeout的理解

疑問點(diǎn)1 同步代碼執(zhí)行完了 setTimeout會(huì)從0計(jì)時(shí)嗎

    setTimeout(() => {
      console.log('setTimeout');
    }, 1000);
    console.log('奧特曼');
    for (let i = 0; i < 1000; i++) {
      console.log('');
    }

此時(shí)要表明的是 我在for循環(huán)的時(shí)候setTimeout也會(huì)去計(jì)時(shí)  他會(huì)去開啟一個(gè)定時(shí)器模塊 ,所以說執(zhí)行主線程的時(shí)候,定時(shí)器模塊已經(jīng)開始執(zhí)行了,所以不會(huì)再去等待1秒去執(zhí)行

(千萬別以為同步執(zhí)行完了,再去計(jì)時(shí)哦)      

疑問點(diǎn)2:兩個(gè)定時(shí)器 上面的定時(shí)器先執(zhí)行 在執(zhí)行下面的定時(shí)器嗎?

測(cè)驗(yàn)我們只修要在加一個(gè)定時(shí)器 看看誰先執(zhí)行就好了

    setTimeout(() => {
      console.log('setTimeout1');
    }, 2000);
    setTimeout(() => {
      console.log('setTimeout2');
    }, 1000);

 結(jié)果發(fā)現(xiàn) 如果有兩個(gè)定時(shí)器,時(shí)間少的會(huì)優(yōu)先放到主線程里去執(zhí)行 

疑問點(diǎn)3:定義一個(gè)變量為0   設(shè)置兩個(gè)一樣的定時(shí)器事件 他會(huì)輸出什么結(jié)果 ? (面試題)

    i = 0
    setTimeout(() => {
      console.log(++i);  //1
    }, 1000);
    setTimeout(() => {
      console.log(++i);  //2 
    }, 1000);

看到現(xiàn)在 肯定要知道 定時(shí)器宏任務(wù)不是一起執(zhí)行的    依次執(zhí)行??!

宏任務(wù)、微任務(wù) 執(zhí)行順序面試題

    console.log('1');
    setTimeout(function () {
      console.log('2');
      process.nextTick(function () {
        console.log('3');
      })
      new Promise(function (resolve) {
        console.log('4');
        resolve();
      }).then(function () {
        console.log('5')
      })
    })
    process.nextTick(function () {
      console.log('6');
    })
    new Promise(function (resolve) {
      console.log('7');
      resolve();
    }).then(function () {
      console.log('8')
    })
    setTimeout(function () {
      console.log('9');
      process.nextTick(function () {
        console.log('10');
      })
      new Promise(function (resolve) {
        console.log('11');
        resolve();
      }).then(function () {
        console.log('12')
      })
    })

答案 :

第一輪 執(zhí)行外面同步代碼 : 1     7   

第二輪 執(zhí)行 微任務(wù) : 6    8    

第三輪 宏任務(wù)  第一個(gè)setTimeout : 同步  2  4   微任務(wù) 3   5   第二個(gè)setTimeout:同步  9   11    微任務(wù)  10   12 

整體答案:  1、7 、6、8、2、4、3、5、9、11、10、12

2021.8.6 

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        console.log(1);
        setTimeout(()=>{
            console.log(2);
        },20)
        console.log(3);
        setTimeout(()=>{
            console.log(4);
        },0)
        console.log(5);
        setTimeout(()=>{
            console.log(6);
        },10)
        console.log(9);
        setTimeout(()=>{
            console.log(10);
        },10)
        for(var i =0;i<4047999;i++){}
        console.log(7);
        setTimeout(()=>{
            console.log(8);
        },10)
        console.log(11);
        setTimeout(()=>{
            console.log(12);
        },10)
    </script>
</body>
</html>

答案 :1 3 5 9 7 11 4 6 10 2 8 12 

剛開始整個(gè)同步代碼宏任務(wù):  1 3 5 9 7 11

setTimeout宏任務(wù):4  6  10  2   8 12

為什么執(zhí)行2  不執(zhí)行下面的呢 因?yàn)閒or循環(huán)中已經(jīng)執(zhí)行了 阻塞了下面的代碼  定時(shí)器模塊2已經(jīng)輸出了所以在執(zhí)行下面的,更重要的是 和你的瀏覽器運(yùn)行速度有很大的關(guān)系  上面的for循環(huán)中的4047999 是針對(duì)我瀏覽器的運(yùn)行速度,不斷的刷新 可能出現(xiàn)不同的結(jié)果。你可以繼續(xù)把這個(gè)數(shù)加大那么一直先輸出的都是2  如果你調(diào)的很小那么2就會(huì)最后輸出

到此這篇關(guān)于JavaScript宏任務(wù)(macrotask)和 微任務(wù)(microtask) 執(zhí)行順序的文章就介紹到這了,更多相關(guān)js宏任務(wù)和 微任務(wù)執(zhí)行順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js實(shí)現(xiàn)圖片輪播效果學(xué)習(xí)筆記

    js實(shí)現(xiàn)圖片輪播效果學(xué)習(xí)筆記

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)圖片輪播效果的學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • js簡(jiǎn)單的點(diǎn)擊返回頂部效果實(shí)現(xiàn)方法

    js簡(jiǎn)單的點(diǎn)擊返回頂部效果實(shí)現(xiàn)方法

    這篇文章主要介紹了js簡(jiǎn)單的點(diǎn)擊返回頂部效果實(shí)現(xiàn)方法,實(shí)例分析了實(shí)現(xiàn)返回頂部效果的相關(guān)要點(diǎn)與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-04-04
  • JavaScript下利用fso判斷文件是否存在的代碼

    JavaScript下利用fso判斷文件是否存在的代碼

    JavaScript下利用fso判斷文件是否存在的代碼,需要的朋友可以參考下,這個(gè)一般需要運(yùn)行確認(rèn)的。
    2010-12-12
  • javascript常用的數(shù)組過濾和查找方法總結(jié)

    javascript常用的數(shù)組過濾和查找方法總結(jié)

    這篇文章主要介紹了javascript常用的數(shù)組過濾和查找方法的相關(guān)資料,這些方法各有特點(diǎn),適用于不同的數(shù)據(jù)處理場(chǎng)景,大家可以根據(jù)需求選擇不同的方法,需要的朋友可以參考下
    2024-12-12
  • Webpack4+Babel7+ES6兼容IE8的實(shí)現(xiàn)

    Webpack4+Babel7+ES6兼容IE8的實(shí)現(xiàn)

    這篇文章主要介紹了Webpack4+Babel7+ES6兼容IE8的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • javascript實(shí)現(xiàn)緩動(dòng)動(dòng)畫效果

    javascript實(shí)現(xiàn)緩動(dòng)動(dòng)畫效果

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)緩動(dòng)動(dòng)畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 一文了解你不知道的JavaScript異步篇

    一文了解你不知道的JavaScript異步篇

    這篇文章主要為大家詳細(xì)介紹了一些你不知道的JavaScript異步相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaScript有一定幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • Clipboard.js 無需Flash的JavaScript復(fù)制粘貼庫

    Clipboard.js 無需Flash的JavaScript復(fù)制粘貼庫

    這篇文章主要介紹了JavaScript 內(nèi)容復(fù)制(無需flash) Clipboard.js使用方法,需要的朋友可以參考下
    2015-10-10
  • JavaScript使用canvas實(shí)現(xiàn)錨點(diǎn)摳圖功能

    JavaScript使用canvas實(shí)現(xiàn)錨點(diǎn)摳圖功能

    在日常的圖片處理中,我們經(jīng)常會(huì)遇到需要摳圖的情況,無論是為了美化照片、制作海報(bào),還是進(jìn)行圖片合成,摳圖對(duì)于我們來說也是一種很常用的功能了,今天就讓我們一起來看下怎么使用canvas來實(shí)現(xiàn)一個(gè)錨點(diǎn)摳圖功能
    2024-03-03
  • 微信小程序?qū)崿F(xiàn)頂部選項(xiàng)卡(swiper)

    微信小程序?qū)崿F(xiàn)頂部選項(xiàng)卡(swiper)

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)頂部選項(xiàng)卡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論

怀仁县| 类乌齐县| 绥宁县| 陕西省| 松阳县| 涞源县| 沁源县| 万盛区| 鄂伦春自治旗| 西和县| 仁怀市| 迁安市| 成武县| 陕西省| 平罗县| 绥宁县| 望奎县| 孝昌县| 黔江区| 邮箱| 陈巴尔虎旗| 曲阳县| 吉木乃县| 平和县| 扶沟县| 锡林郭勒盟| 龙川县| 云阳县| 禹城市| 兖州市| 鄱阳县| 西贡区| 望江县| 苏尼特右旗| 措美县| 松江区| 化隆| 南郑县| 绥中县| 寻乌县| 冀州市|