国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

單線程JavaScript為何如此高效

開發(fā) 前端
由于 setTimeout 的延遲時間為 0,所以會在下一個事件循環(huán)中執(zhí)行,因此會打印 "timeout"。代碼的執(zhí)行順序是按照同步代碼的順序執(zhí)行,異步代碼則根據(jù)事件循環(huán)的機制來執(zhí)行。async/await 會暫停同步代碼的執(zhí)行,并等待異步操作完成后再繼續(xù)執(zhí)行后續(xù)的代碼。

什么是js執(zhí)行機制

JavaScript 的執(zhí)行機制指的是 JavaScript 代碼在運行時的工作方式和順序。它涉及以下幾個關(guān)鍵概念:

  1. 單線程:JavaScript 是一門單線程的編程語言,意味著它只有一個主線程用于執(zhí)行代碼。這意味著 JavaScript 中的代碼是按順序執(zhí)行的,一次只能執(zhí)行一個任務(wù)。
  2. 任務(wù)隊列:JavaScript 通過任務(wù)隊列來管理要執(zhí)行的任務(wù)。任務(wù)隊列中存放著各種類型的任務(wù),包括同步任務(wù)和異步任務(wù)。
  3. 事件循環(huán):JavaScript 的事件循環(huán)是一個持續(xù)運行的過程,它負(fù)責(zé)監(jiān)視任務(wù)隊列并選擇下一個要執(zhí)行的任務(wù)。事件循環(huán)不斷地從任務(wù)隊列中獲取任務(wù)并將其交給主線程執(zhí)行。
  4. 同步任務(wù)和異步任務(wù):同步任務(wù)是按照順序在主線程上執(zhí)行的任務(wù),執(zhí)行一個任務(wù)時會阻塞后續(xù)任務(wù)的執(zhí)行。異步任務(wù)是在主線程上注冊并在將來某個時間點執(zhí)行的任務(wù),執(zhí)行異步任務(wù)時不會阻塞后續(xù)任務(wù)的執(zhí)行。
  5. 微任務(wù)和宏任務(wù):JavaScript 中的任務(wù)可以分為微任務(wù)和宏任務(wù)。微任務(wù)是在當(dāng)前任務(wù)執(zhí)行完畢后立即執(zhí)行的任務(wù),它們使用微任務(wù)隊列進行管理。而宏任務(wù)是在事件循環(huán)的下一輪中執(zhí)行的任務(wù),它們使用任務(wù)隊列進行管理。

JavaScript 的執(zhí)行順序:

  1. 執(zhí)行同步任務(wù),將函數(shù)調(diào)用和變量分配到調(diào)用棧中按順序執(zhí)行。
  2. 遇到異步任務(wù),如定時器、事件監(jiān)聽等,將其注冊到任務(wù)隊列中,并繼續(xù)執(zhí)行后續(xù)的同步代碼。
  3. 當(dāng)同步代碼執(zhí)行完畢后,主線程會檢查微任務(wù)隊列,依次執(zhí)行隊列中的微任務(wù)。
  4. 執(zhí)行完微任務(wù)后,主線程會從任務(wù)隊列中取出一個宏任務(wù)執(zhí)行。
  5. 循環(huán)執(zhí)行步驟 3 和步驟 4,直至任務(wù)隊列和微任務(wù)隊列都為空。

需要注意的是,JavaScript 中的異步任務(wù)通常是通過回調(diào)函數(shù)、Promise、async/await 等機制來處理。通過合理使用異步任務(wù)和任務(wù)隊列,可以實現(xiàn)非阻塞的代碼執(zhí)行,提高代碼的性能和響應(yīng)能力。JavaScript 的執(zhí)行機制主要涉及以下幾個概念:調(diào)用棧、事件循環(huán)和任務(wù)隊列。文字有點單調(diào),看看下面的圖理解理解

圖片圖片

讓我們通過一個例子來解釋這些概念。假設(shè)我們有以下代碼:

console.log("Script start");


setTimeout(function() {
  console.log("setTimeout");
}, 0);


Promise.resolve().then(function() {
  console.log("Promise");
});


console.log("Script end");

這段代碼的執(zhí)行機制如下:

  1. 首先,開始執(zhí)行代碼,遇到第一行 console.log("Script start"),它會立即打印 "Script start"。
  2. 接下來,遇到 setTimeout,它是一個異步函數(shù),會被放入任務(wù)隊列中,并設(shè)置一個定時器。由于定時器時間為 0,所以不會立即執(zhí)行。
  3. 然后,遇到 Promise.resolve().then(),它會創(chuàng)建一個 Promise 對象,并將 .then() 中的回調(diào)函數(shù)放入微任務(wù)隊列中。
  4. 繼續(xù)執(zhí)行下一行,打印 "Script end"。
  5. 此時,主線程上的同步代碼執(zhí)行完畢,開始執(zhí)行微任務(wù)隊列中的任務(wù)。首先執(zhí)行 Promise 的回調(diào)函數(shù),打印 "Promise"。
  6. 接著,主線程開始執(zhí)行任務(wù)隊列中的任務(wù)。由于定時器時間到達,setTimeout 的回調(diào)函數(shù)被放入任務(wù)隊列中。
  7. 最后,主線程執(zhí)行任務(wù)隊列中的任務(wù),打印 "setTimeout"。

綜上所述,JavaScript 的執(zhí)行機制遵循以下步驟:

  1. 執(zhí)行同步代碼,將函數(shù)調(diào)用和變量分配到調(diào)用棧中按順序執(zhí)行。
  2. 遇到異步操作,如定時器、事件監(jiān)聽等,將其注冊到任務(wù)隊列中,并繼續(xù)執(zhí)行后續(xù)的同步代碼。
  3. 同步代碼執(zhí)行完畢后,主線程會檢查微任務(wù)隊列,依次執(zhí)行隊列中的微任務(wù)(Promise 回調(diào)函數(shù))。
  4. 執(zhí)行完微任務(wù)后,主線程會從任務(wù)隊列中取出任務(wù)執(zhí)行,執(zhí)行完一個任務(wù)后再檢查微任務(wù)隊列,如此循環(huán),直至任務(wù)隊列為空。

需要注意的是,微任務(wù)優(yōu)先級高于任務(wù)隊列中的任務(wù),所以在執(zhí)行任務(wù)隊列中的任務(wù)之前,會先執(zhí)行完所有的微任務(wù)。

現(xiàn)學(xué)現(xiàn)用,再看一個例子:

async function async1() {
	  console.log("async1 start");
	  await async2();
	  console.log("async1 end");
    }
    async function async2() {
        console.log("async2");
    }
    console.log("js start");
    setTimeout(function () {
      console.log("timeout");
    }, 0);
    async1();
    new Promise(function (resolve) {
        console.log("promise");
        resolve();
    }).then(function () {
        console.log("then");
    });
    console.log("js end");

這段代碼的打印順序如下:

  1. "js start":立即打印,表示 JavaScript 代碼的開始執(zhí)行。
  2. "async1 start":由于 async1 函數(shù)被調(diào)用,所以會打印 "async1 start"。
  3. "async2":async1 函數(shù)中調(diào)用了 async2 函數(shù),因此會打印 "async2"。
  4. "promise":new Promise 的回調(diào)函數(shù)立即執(zhí)行,所以會打印 "promise"。
  5. "js end":立即打印,表示 JavaScript 代碼的執(zhí)行結(jié)束。
  6. "async1 end":由于 async2 函數(shù)是一個異步函數(shù),await async2() 表達式會等待 async2 函數(shù)執(zhí)行完畢,然后繼續(xù)執(zhí)行下面的代碼,所以會打印 "async1 end"。
  7. "then":Promise 的 then 方法是異步執(zhí)行的,所以會在下一個事件循環(huán)中執(zhí)行,因此會打印 "then"。
  8. "timeout":由于 setTimeout 的延遲時間為 0,所以會在下一個事件循環(huán)中執(zhí)行,因此會打印 "timeout"。代碼的執(zhí)行順序是按照同步代碼的順序執(zhí)行,異步代碼則根據(jù)事件循環(huán)的機制來執(zhí)行。async/await 會暫停同步代碼的執(zhí)行,并等待異步操作完成后再繼續(xù)執(zhí)行后續(xù)的代碼。

總結(jié)

JS 代碼的執(zhí)行順序主要為:

  1. 同步代碼 同步代碼(sync code)直接進入執(zhí)行棧執(zhí)行。執(zhí)行順序按代碼書寫順序。
  2. 異步任務(wù)回調(diào) 異步任務(wù)(如 setTimeout)進入任務(wù)隊列。
  3. 事件循環(huán) 事件循環(huán)周期性地從任務(wù)隊列取出任務(wù),推入執(zhí)行棧執(zhí)行。當(dāng)執(zhí)行棧為空時,才會取出隊列中的任務(wù)。
  4. 執(zhí)行棧先進后出 執(zhí)行棧采用先進后出的方式執(zhí)行函數(shù)。在函數(shù)執(zhí)行完畢后才會執(zhí)行上層函數(shù)。這保證了函數(shù)的正確嵌套調(diào)用。
  5. 微任務(wù)優(yōu)先級高于宏任務(wù)
  • 宏任務(wù)(macrotask):出于任務(wù)隊列的任務(wù)。比如 setTimeout、setInterval。
  • 微任務(wù)(microtask):比如 Promise .then、MutationObserver 。微任務(wù)的優(yōu)先級高于宏任務(wù)。所以整個執(zhí)行順序可以描述為:
  1. 同步代碼按順序進入執(zhí)行棧執(zhí)行
  2. 異步宏任務(wù)進入任務(wù)隊列
  3. 當(dāng)執(zhí)行棧清空時,執(zhí)行微任務(wù)
  4. 接著執(zhí)行宏任務(wù)
  5. 循環(huán)往復(fù)
責(zé)任編輯:武曉燕 來源: 海燕技術(shù)棧
相關(guān)推薦

2024-10-31 11:16:19

高并發(fā)并發(fā)集JDK

2021-08-25 23:08:52

微服務(wù)編程IT

2024-03-22 11:27:54

電纜管理數(shù)據(jù)中心

2022-05-06 17:34:27

安全代碼軟件漏洞

2014-08-08 15:36:58

2015-01-08 15:38:34

Fire Phone

2009-12-04 09:46:02

Linux操作系統(tǒng)

2021-01-26 16:21:46

邊緣計算5GIoT

2024-09-18 05:30:00

GPU內(nèi)存人工智能

2025-01-17 08:23:33

2017-03-06 14:08:38

JavaScript單線程setTimeout

2009-09-17 13:06:24

2012-05-10 10:23:10

技術(shù)人員開發(fā)

2022-06-08 13:11:35

比特幣挖礦區(qū)塊鏈

2010-07-16 16:06:11

求職

2009-07-10 09:05:20

SwingWorker

2021-08-30 14:23:41

身份驗證隱私管理網(wǎng)絡(luò)安全

2025-01-13 07:33:47

2020-09-23 13:37:25

Redis6.0

2013-07-16 09:31:11

點贊
收藏

51CTO技術(shù)棧公眾號

成人高潮aa毛片免费| 精品成人影院| 亚洲人精品一区| 99在线|亚洲一区二区| 在线视频综合导航| www.色就是色| 日韩成人免费电影| 国产精品视频一| 精品自拍视频| 精品久久五月天| 一区二区三区高清在线视频| 久久精品一区四区| 亚洲第一综合网站| 1024成人| 成人激情视频在线播放| 中文成人激情娱乐网| 精品久久国产字幕高潮| 日韩三级电影网| 亚洲少妇屁股交4| 黄色免费观看视频网站| 久久69国产一区二区蜜臀| 99高清视频有精品视频| 亚州精品视频| 欧美激情xxxxx| 色999韩欧美国产综合俺来也| 精品国产一区二区三区四区四| 韩国精品视频| 亚洲国产中文字幕| 在线观看国产一级片| 国产盗摄视频一区二区三区| 国产一区在线观| 999久久久精品国产| 69视频在线免费观看| 日本免费一区二区视频| 久久伊人色综合| 亚洲最大网站| 亚洲精品小视频| 亚洲优女在线| 欧美一区二区免费视频| 经典三级在线| 岛国av一区二区| 外国精品视频在线观看| 亚洲第一主播视频| 在线观看成年人视频| 日韩美女视频一区二区| 69日小视频在线观看| 亚洲免费三区一区二区| 婷婷综合影院| 色一情一乱一乱一91av| av中文天堂在线| 欧美日韩二区三区| 国产精品蜜臀| 日韩成人在线视频观看| 中文字幕在线直播| 中文一区二区视频| 欧美三级一区| 欧洲午夜精品久久久| 日韩欧美中字| 国内一区在线| 日韩中文字幕麻豆| 中国女人做爰视频| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美日韩精品免费观看视频完整| 51国产成人精品午夜福中文下载| 婷婷亚洲最大| 日本一区高清在线视频| 高清不卡在线观看av| 日日摸天天爽天天爽视频| 亚洲欧美日韩一区二区三区在线观看| 一本一道dvd在线观看免费视频| 在线观看日韩毛片| 午夜伦理福利在线| 久久久久久91香蕉国产| 日韩一区电影| 欧美日韩一区二区视频在线观看| 美腿丝袜亚洲综合| 手机看片福利日韩| 欧美性猛交xxxx免费看| 日本蜜桃在线观看视频| 欧美俄罗斯乱妇| 女人色偷偷aa久久天堂| 最新欧美日韩亚洲| 国产精品久久久久一区| 91这里只有精品| 久久精品成人动漫| 国产精品福利在线观看播放| 亚洲欧洲久久| 国产精品久久看| 精品国产白色丝袜高跟鞋| 亚洲天堂成人在线视频| 免费国产自久久久久三四区久久| 欧美深深色噜噜狠狠yyy| 91一区在线观看| 国产专区在线| 最新69国产成人精品视频免费| 中日韩免视频上线全都免费| 视频一区视频二区视频| 亚洲欧美日韩国产另类专区| 手机在线免费观看av| 欧美不卡视频一区发布| 亚洲欧洲另类| 视频二区在线播放| 欧美一级二级三级乱码| 欧美大胆视频| 最新欧美日韩亚洲| 精品国产福利在线| 四虎影视精品永久在线观看| 国产一区二区免费电影| 国产欧美日韩另类一区| 免费在线观看av电影| 国产suv精品一区二区| 国产在线精品视频| 色就是色亚洲色图| 日韩视频精品在线| 国产精品久久久久久模特 | 国产精品456露脸| 麻豆传媒在线播放| 在线午夜精品自拍| 亚洲视频1区| 欧美成人女星排名| 在线精品视频一区二区三四| 日韩av一级片| 一本免费视频| 国产精品99久久久久久www| 美女视频一区免费观看| 超碰超碰在线观看| 亚洲日韩欧美视频| 欧美日韩一区自拍| 成年人视频网站| 亚洲天堂av在线免费| 亚洲伦伦在线| 日本私人影院在线观看| 欧美人在线视频| 国产伦精品一区二区三区视频青涩| 在线观看国产视频| 欧美最猛性xxxxx亚洲精品| av不卡在线观看| 日韩伦理福利| 亚洲高清不卡一区| 欧美日韩久久不卡| 欧美一区影院| 在线观看导航| 国产精品999999| 亚洲色图视频免费播放| 久久在线观看| 成人毛片视频网站| 国产亚洲xxx| 国产风韵犹存在线视精品| 成年人在线网站| 日韩资源av在线| 欧美日韩国产在线观看| 欧美1区3d| 亚洲人成77777男人| 国产伦精品一区二区三区精品视频 | 国产美女精品一区二区三区| 四虎亚洲成人| 免费精品视频一区| 91精品国产综合久久精品性色| 你懂的国产精品永久在线| 日本亚洲欧美| 亚洲在线免费看| 色999日韩国产欧美一区二区| 欧美精品一区二区三区精品| 国产午夜在线| 国产日韩精品在线播放| 欧美日韩日本国产| 亚洲经典自拍| 欧美1—12sexvideos| 宅男一区二区三区| 亚洲欧洲一区二区三区久久| 国产精品99久久不卡二区| 黄色成人在线视频| 国产激情在线观看视频| 欧美激情性做爰免费视频| 亚洲品质自拍视频网站| 日韩国产欧美| 日韩中文字幕在线视频| 超碰在线97国产| 日韩精品福利片午夜免费观看| 三级精品视频久久久久| 国产片一区二区| 久操精品在线| 精品99又大又爽又硬少妇毛片| 国产一区二区三区黄| 亚洲国产古装精品网站| 国产成人鲁色资源国产91色综| 99er精品视频| 久久综合色播| 99国产视频| 日韩电影大全免费观看2023年上| 成人av电影在线网| 欧美日韩国产在线观看网站| 青青草在线免费视频| 欧美视频1区| 日韩亚洲一区二区| 亚洲精品乱码久久久久久久久 | 国产在线播放一区二区三区| 自拍偷拍亚洲图片| 一级二级三级在线观看| 欧美亚洲精品日韩|