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

當前位置:雨林木風下載站 > 網頁設計教程 > 詳細頁面

深入剖析JavaScript異步之事件輪詢

深入剖析JavaScript異步之事件輪詢

更新時間:2025-12-08 文章作者:未知 信息來源:網絡 閱讀次數:

網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立...
網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家帶來的內容是關于深入剖析JavsScript異步之事件輪詢,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

JavsScript 是一門單線程的編程語言,這就意味著一個時間里只能處理一件事,也就是說 JavaScript 引擎一次只能在一個線程里處理一條語句。

雖然單線程簡化了編程代碼,因為你不必太擔心并發引出的問題,這也意味著你將在阻塞主線程的情況下執行長時間的操作,如網絡請求。

想象一下從API請求一些數據,根據具體的情況,服務器需要一些時間來處理請求,同時阻塞主線程,使網頁長時間處于無響應的狀態。

這就是引入異步 JavaScript 的原因。使用異步 JavaScript(如 回調函數、promise、async/await),可以不用阻塞主線程的情況下長時間執行網絡請求 :)

可能你知道不知道 異步 JavsScript 是如何工作,并不要緊,但知道它是如何工作,對 JavaScript 異步更深入的了解是有幫助的。

所以不在啰嗦了,我們開始吧 :)

同步JavaScript是如何工作的?

在深入研究異步JavaScript之前,讓我們首先了解同步 JavaScript 代碼如何在 JavaScript 引擎中執行。例如:

    const second = () => {
      console.log('Hello there!');
    }
    
    const first = () => {
      console.log('Hi there!');
      second();
      console.log('The End');
    }
    
    first();

要理解上述代碼如何在 JavaScript 引擎中執行,我們必須理解執行上下文和調用堆棧(也稱為執行堆棧)的概念。

函數代碼在函數執行上下文中執行,全局代碼在全局執行上下文中執行。每個函數都有自己的執行上下文。

調用棧

調用堆棧顧名思義是一個具有LIFO(后進先出)結構的堆棧,用于存儲在代碼執行期間創建的所有執行上下文。

JavaScript 只有一個調用棧,因為它是一種單線程編程語言。調用堆棧具有 LIFO 結構,這意味著項目只能從堆棧頂部添加或刪除。

讓我們回到上面的代碼片段,并嘗試理解代碼如何在JavaScript引擎中執行。

const second = () => {
  console.log('Hello there!');
}
const first = () => {
  console.log('Hi there!');
  second();
  console.log('The End');
}
first();

3505796205-5bf79b3adf376_articlex.png

這里發生了什么?

當執行此代碼時,將創建一個全局執行上下文(由main()表示)并將其推到調用堆棧的頂部。當遇到對first()的調用時,它會被推送到堆棧的頂部。

接下來,console.log('Hi there!')被推送到堆棧的頂部,當它完成時,它會從堆棧中彈出。之后,我們調用second(),因此second()函數被推到堆棧的頂部。

console.log('Hello there!')被推送到堆棧頂部,并在完成時彈出堆棧。second() 函數結束,因此它從堆棧中彈出。

console.log(“the End”)被推到堆棧的頂部,并在完成時刪除。之后,first()函數完成,因此從堆棧中刪除它。

程序在這一點上完成了它的執行,所以全局執行上下文(main())從堆棧中彈出。

異步JavaScript是如何工作的?

現在我們已經對調用堆棧和同步JavaScript的工作原理有了基本的了解,讓我們回到異步JavaScript。

阻塞是什么?

讓我們假設我們正在以同步的方式進行圖像處理或網絡請求。例如:

const processImage = (image) => {
  /**
  * doing some operations on image
  **/
  console.log('Image processed');
}
const networkRequest = (url) => {
  /**
  * requesting network resource
  **/
  return someData;
}
const greeting = () => {
  console.log('Hello World');
}
processImage(logo.jpg);
networkRequest('www.somerandomurl.com');
greeting();

做圖像處理和網絡請求需要時間,當processImage()函數被調用時,它會根據圖像的大小花費一些時間。

processImage() 函數完成后,將從堆棧中刪除它。然后調用 networkRequest() 函數并將其推入堆棧。同樣,它也需要一些時間來完成執行。

最后,當networkRequest()函數完成時,調用greeting()函數,因為它只包含一個控制臺。日志語句和控制臺。日志語句通常很快,因此greeting()函數立即執行并返回。

因此,我們必須等待函數(如processImage()或networkRequest())完成。這意味著這些函數阻塞了調用堆棧或主線程。因此,在執行上述代碼時,我們不能執行任何其他操作,這是不理想的。

那么解決辦法是什么呢?

最簡單的解決方案是異步回調。我們使用異步回調使代碼非阻塞。例如:

const networkRequest = () => {
  setTimeout(() => {
    console.log('Async Code');
  }, 2000);
};
console.log('Hello World');
networkRequest();

這里我使用了setTimeout方法來模擬網絡請求。請記住setTimeout不是JavaScript引擎的一部分,它是web api(在瀏覽器中)和C/ c++ api(在node.js中)的一部分。

為了理解這段代碼是如何執行的,我們必須理解更多的概念,比如事件輪詢和回調隊列(或消息隊列)。

380725970-5bf7a056982d9_articlex.png

事件輪詢、web api和消息隊列不是JavaScript引擎的一部分,而是瀏覽器的JavaScript運行時環境或Nodejs JavaScript運行時環境的一部分(對于Nodejs)。在Nodejs中,web api被c/c++ api所替代。

現在讓我們回到上面的代碼,看看它是如何異步執行的。

const networkRequest = () => {
  setTimeout(() => {
    console.log('Async Code');
  }, 2000);
};

console.log('Hello World');

networkRequest();

console.log('The End');

1323757194-5bf7a5ea7065d_articlex.gif

當上述代碼在瀏覽器中加載時,console.log(' Hello World ') 被推送到堆棧中,并在完成后彈出堆棧。接下來,將遇到對 networkRequest() 的調用,因此將它推到堆棧的頂部。

下一個 setTimeout() 函數被調用,因此它被推到堆棧的頂部。setTimeout()有兩個參數:

  • 1) 回調和

  • 2) 以毫秒(ms)為單位的時間。

setTimeout() 方法在web api環境中啟動一個2s的計時器。此時,setTimeout()已經完成,并從堆棧中彈出。cosole.log(“the end”) 被推送到堆棧中,在完成后執行并從堆棧中刪除。

同時,計時器已經過期,現在回調被推送到消息隊列。但是回調不會立即執行,這就是事件輪詢開始的地方。

事件輪詢

事件輪詢的工作是監聽調用堆棧,并確定調用堆棧是否為空。如果調用堆棧是空的,它將檢查消息隊列,看看是否有任何掛起的回調等待執行。

在這種情況下,消息隊列包含一個回調,此時調用堆棧為空。因此,事件輪詢將回調推到堆棧的頂部。

然后是 console.log(“Async Code”) 被推送到堆棧頂部,執行并從堆棧中彈出。此時,回調已經完成,因此從堆棧中刪除它,程序最終完成。

消息隊列還包含來自DOM事件(如單擊事件和鍵盤事件)的回調。例如:

document.querySelector('.btn').addEventListener('click',(event) => {
  console.log('Button Clicked');
});

對于DOM事件,事件偵聽器位于web api環境中,等待某個事件(在本例中單擊event)發生,當該事件發生時,回調函數被放置在等待執行的消息隊列中。

同樣,事件輪詢檢查調用堆棧是否為空,并在調用堆棧為空并執行回調時將事件回調推送到堆棧。

延遲函數執行

我們還可以使用setTimeout來延遲函數的執行,直到堆棧清空為止。例如

const bar = () => {
  console.log('bar');
}
const baz = () => {
  console.log('baz');
}
const foo = () => {
  console.log('foo');
  setTimeout(bar, 0);
  baz();
}
foo();

打印結果:

foo
baz
bar

當這段代碼運行時,第一個函數foo()被調用,在foo內部我們調用console.log('foo'),然后setTimeout()被調用,bar()作為回調函數和時0秒計時器。

現在,如果我們沒有使用 setTimeout, bar() 函數將立即執行,但是使用 setTimeout 和0秒計時器,將bar的執行延遲到堆棧為空的時候。

0秒后,bar()回調被放入等待執行的消息隊列中。但是它只會在堆棧完全空的時候執行,也就是在baz和foo函數完成之后。

ES6 任務隊列

我們已經了解了異步回調和DOM事件是如何執行的,它們使用消息隊列存儲等待執行所有回調。

ES6引入了任務隊列的概念,任務隊列是 JavaScript 中的 promise 所使用的。消息隊列和任務隊列的區別在于,任務隊列的優先級高于消息隊列,這意味著任務隊列中的promise 作業將在消息隊列中的回調之前執行,例如:

const bar = () => {
  console.log('bar');
};

const baz = () => {
  console.log('baz');
};

const foo = () => {
  console.log('foo');
  setTimeout(bar, 0);
  new Promise((resolve, reject) => {
    resolve('Promise resolved');
  }).then(res => console.log(res))
    .catch(err => console.log(err));
  baz();
};

foo();

打印結果:

foo
baz
Promised resolved
bar

我們可以看到 promise 在 setTimeout 之前執行,因為 promise 響應存儲在任務隊列中,任務隊列的優先級高于消息隊列。

小結

因此,我們了解了異步 JavaScript 是如何工作的,以及調用堆棧、事件循環、消息隊列和任務隊列等概念,這些概念共同構成了 JavaScript 運行時環境。雖然成為一名出色的JavaScript開發人員并不需要學習所有這些概念,但是了解這些概念是有幫助的:)

以上就是深入剖析JavaScript異步之事件輪詢的詳細內容,更多請關注php中文網其它相關文章!


網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费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| 牛夜精品久久久久久久| 国产一二三四在线视频| caoporn超碰97| 一区二区三区免费播放| 欧美日韩亚洲自拍| 狠狠干狠狠操视频| 91丝袜超薄交口足| www.偷拍.com| 日韩精品手机在线观看| 超薄肉色丝袜足j调教99| 最新视频 - x88av| 亚洲 欧美 日韩 国产综合 在线| 国产av人人夜夜澡人人爽麻豆| 狠狠干 狠狠操| 久久久久久久激情| 日本超碰在线观看| 一区二区三区四区免费观看| www成人免费| 青青艹视频在线| 成人午夜激情av| 日本一二三区在线| 国产人妻777人伦精品hd| 国产成人a亚洲精v品无码| 免费一级特黄录像| 8x8x华人在线| av免费播放网址| 99精品999| 精品久久久久久无码中文野结衣 | 四季av一区二区| 欧美视频国产视频| 青青草国产免费| 久久综合伊人77777麻豆最新章节| 自拍一级黄色片| 日韩欧美视频网站| 色中文字幕在线观看| 免费看又黄又无码的网站| 四季av一区二区三区| 日韩视频在线视频| 99九九精品视频| 韩国日本在线视频| 日韩欧美一级在线| 在线免费黄色网| 99久久国产宗和精品1上映| 精品国产三级a∨在线| 国产精品自拍视频在线| 丰满少妇被猛烈进入高清播放| 国产免费中文字幕| 无码日韩人妻精品久久蜜桃| 亚洲精品在线网址| 色七七在线观看| 日韩网站在线免费观看| 中国黄色录像片| 亚洲av无日韩毛片久久| 精品久久久久久久无码 | www.玖玖玖| 欧美在线观看黄| 免费在线观看污污视频| 尤蜜粉嫩av国产一区二区三区| 日本免费不卡一区二区| 大陆av在线播放| 成人免费在线网| 国产夫妻自拍一区| 久久久久99精品成人片| 91制片厂免费观看| 久久精品一二三四| 91大神免费观看| 色综合五月婷婷| 日韩精品在线播放视频| 国内自拍视频网| 一区二区三区免费播放| 欧美网站免费观看| 久久这里只有精品8| 成人免费a级片| 丁香色欲久久久久久综合网| 男人添女荫道口喷水视频| 污视频在线观看免费网站| 天堂网成人在线| 亚洲美女爱爱视频| 特级毛片在线免费观看| 久久av喷吹av高潮av| 免费看黄在线看| 青青在线视频观看| 国产美女18xxxx免费视频| 亚洲欧美天堂在线| 日韩视频在线免费播放| 成年人看的毛片| 国产91色在线观看| 黄色一级视频播放| 97成人在线观看视频| 视色视频在线观看| 97av中文字幕| 欧美性猛交久久久乱大交小说| 成人亚洲免费视频| 免费看又黄又无码的网站| 午夜久久福利视频| 国产成a人亚洲精v品在线观看| 精品这里只有精品| 一本之道在线视频| 精品视频一区二区在线| 日本福利视频导航| 任你操这里只有精品| 亚洲国产精品影视| 99久久激情视频| 乱熟女高潮一区二区在线| 免费观看成人在线视频| 992tv快乐视频| 欧美日韩亚洲一二三| 国产aaa免费视频| 182午夜在线观看| 欧美 日韩精品| 日本黄xxxxxxxxx100| 四季av一区二区三区| 久久婷婷国产精品| 人妻av无码专区| 国产高清精品软男同| 国产一二三区av| 大j8黑人w巨大888a片| 亚洲精品国产suv一区88| 99九九精品视频| 亚洲欧美激情网| 久草福利视频在线| 国内外成人免费激情视频| 少妇av一区二区三区无码| 免费观看国产视频在线| 超碰中文字幕在线观看| 亚洲综合伊人久久| 亚洲天堂国产视频| 奇米影视四色在线| 亚洲第一狼人区| 在线观看av日韩| 国产三级国产精品国产专区50| 久久久精品在线视频| 不卡av免费在线| 日日碰狠狠躁久久躁婷婷| 69堂免费视频| 国产熟人av一二三区| 天天插天天操天天射| 妺妺窝人体色www在线观看| 哪个网站能看毛片| 91看片在线免费观看| 亚洲综合婷婷久久| 国产性生活一级片| 日本大胆人体视频| 日本免费不卡一区二区| 日本新janpanese乱熟| 性生活免费在线观看| 日韩精品视频网址| 国产aaa免费视频| 欧美精品无码一区二区三区| 污版视频在线观看| 精品少妇人妻av一区二区| 日韩国产成人无码av毛片| 国产精品333| 欧美美女一级片| 水蜜桃在线免费观看| 成人中文字幕在线播放| 天堂视频免费看| 国产免费裸体视频| 久久撸在线视频| www国产免费| 日本特黄a级片| 欧美激情亚洲天堂| 色噜噜狠狠永久免费| 白白操在线视频| 超碰在线公开97| 成人性免费视频| 三日本三级少妇三级99| 1024av视频| 国产日韩欧美大片| 黄色免费网址大全| 欧美一级免费播放| 欧美视频亚洲图片| 青青在线免费观看视频| 国产成人亚洲综合无码| 久久久久久蜜桃一区二区| 国产精品入口芒果| 青青草综合视频| 污污网站免费观看| jizzjizzxxxx| 女人帮男人橹视频播放| 亚洲第一页在线视频| 欧美一级特黄a| 99福利在线观看| 日韩少妇内射免费播放| 女人床在线观看| 日韩video| 五月天六月丁香| 亚洲国产午夜精品| 亚洲 欧美 另类人妖| 不卡av免费在线| 成人一区二区三| 一本久道中文无码字幕av| 成人观看免费完整观看|