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

JavaScript中的異步與同步詳解

 更新時(shí)間:2023年07月24日 11:13:01   作者:coder_7  
這篇文章主要介紹了JavaScript中的異步與同步詳解,如果一個(gè)線程在一個(gè)節(jié)點(diǎn)中添加內(nèi)容,另一個(gè)線程要?jiǎng)h除這個(gè)節(jié)點(diǎn),所以為了不必要的麻煩,js就是一門單線程語(yǔ)言,需要的朋友可以參考下

基本概念

  • 消息隊(duì)列中的任務(wù)分為宏任務(wù)微任務(wù);
  • 調(diào)用棧也可以稱為主線程

單線程:

  • 單線程指的是只有一個(gè)主線程的線程的語(yǔ)言。也就是說(shuō),它并不能像JAVA語(yǔ)言那樣,多個(gè)線程并發(fā)執(zhí)行。
  • JavaScript就是一個(gè)單線程的語(yǔ)言
為什么js是單線程?如果一個(gè)線程在一個(gè)節(jié)點(diǎn)中添加內(nèi)容,另一個(gè)線程要?jiǎng)h除這個(gè)節(jié)點(diǎn)。所以為了不必要的麻煩,js就是一門單線程語(yǔ)言。

js的異步執(zhí)行分析:

  • 拿現(xiàn)實(shí)生活來(lái)舉例,比如一個(gè)人在家(將一個(gè)人比作單線程),你既要煮飯又要炒菜。
  • 這里我們把煮飯算作一個(gè)異步的任務(wù),因?yàn)橹箫埵且粋€(gè)比較耗時(shí)的任務(wù)(一般像比較耗時(shí)或不確定執(zhí)行時(shí)間的任務(wù),比如定時(shí)器,網(wǎng)絡(luò)請(qǐng)求,事件執(zhí)行 都是異步執(zhí)行),其次你沒炒完菜是不會(huì)
  • 去吃飯的(也就是主線程任務(wù)沒有完成,是不會(huì)執(zhí)行異步任務(wù)的)。
  • 那么你可以怎么做呢?你可以把煮飯的任務(wù)交給電飯煲處理。
  • 先把米放入電飯煲交給了電飯煲處理,再去炒菜,炒完菜再去把煮好的飯取出來(lái)。
  • 將飯交給電飯煲處理相當(dāng)于開啟了一個(gè)異步的任務(wù),電飯煲就是處理這個(gè)異步任務(wù)的模塊。飯煮好了會(huì)自動(dòng)跳轉(zhuǎn),這就相當(dāng)于異步任務(wù)被對(duì)應(yīng)的模塊解析好了會(huì)自動(dòng)放入消息隊(duì)列,等待事件循
  • 環(huán)調(diào)入主線程執(zhí)行(前提是主線程任務(wù)全部執(zhí)行完畢)。
  • 主線程任務(wù)執(zhí)行完成,會(huì)通過(guò)不斷的循環(huán)消息隊(duì)列,來(lái)執(zhí)行其中的任務(wù)。
  • 也就是你把炒菜完了,你就會(huì)不斷的觀察飯是否跳轉(zhuǎn)(也就是循環(huán)消息隊(duì)列看是否有任務(wù)),如果有就把飯裝到碗里開始吃飯,此時(shí)任務(wù)就全部完成。
  • 但是干活的始終還是一個(gè)人,這就是單線程的異步執(zhí)行過(guò)程。

圖解:

在這里插入圖片描述

代碼演示:

console.log("遇到煮飯任務(wù),將飯放入電飯煲");
//使用setTimeout模擬煮飯
setTimeout(()=>{
	console.log("飯已經(jīng)煮熟,等待飯被取出");
},0);
console.log("開始炒菜任務(wù)");

你以為的執(zhí)行順序:“遇到煮飯任務(wù),將飯放入電飯煲 ” -> “飯已經(jīng)煮熟,等待飯被取出 -> ”開始炒菜任務(wù)“

但是你想想這樣符合邏輯嗎,你會(huì)等飯熟練才開始炒菜嗎?

最終執(zhí)行順序:“遇到煮飯任務(wù),將飯放入電飯煲 ” -> “開始炒菜任務(wù)” -> “飯已經(jīng)煮熟,等待飯被取出”

顯然js都知道你認(rèn)為的執(zhí)行順序是不符合邏輯的。這里setTimeout就是一個(gè)異步任務(wù),其中的箭頭函數(shù)就是異步完成后回調(diào)的函數(shù)。

解釋疑惑:

JavaScript既然是單線程語(yǔ)言,那么為什么同時(shí)可以執(zhí)行多個(gè)任務(wù)(同時(shí)煮飯炒菜)?

你可能會(huì)想這TM不是廢話嗎,煮飯交給電飯煲了啊。

確實(shí)沒錯(cuò),煮飯任務(wù)交給電飯煲了,那么在js中是誰(shuí)去處理這些異步的任務(wù)呢?

前面異步任務(wù)分析有說(shuō)到,異步任務(wù)會(huì)被對(duì)應(yīng)模塊解析(飯被電飯煲模塊解析)。那么這就和宿主有關(guān)系了,js一般都是運(yùn)行在游覽器上(當(dāng)然有node.js)

也就是寄生在游覽器上,那么宿主就是游覽器。所以是宿主提供的模塊去處理這些異步任務(wù),使得js可以實(shí)現(xiàn)與其他語(yǔ)言類似的多線程操作。

補(bǔ)充異步任務(wù)執(zhí)行順序:

而常見的promise,async,await 執(zhí)行放入的是微任務(wù)隊(duì)列中,主線程的代碼執(zhí)行完后,會(huì)優(yōu)先循環(huán)微任務(wù)隊(duì)列的代碼,再是宏任務(wù)隊(duì)列。主線程 > 微任務(wù) > 宏任務(wù)注意??!宏任務(wù)隊(duì)列與微任務(wù)隊(duì)列的任務(wù)都是誰(shuí)先進(jìn)入隊(duì)列誰(shuí)先執(zhí)行。

js的同步執(zhí)行解析

代碼由上至下依次執(zhí)行。前面任務(wù)在執(zhí)行,后面代碼必須排隊(duì)等待。就如上面的例子如果不做異步處理,讓任務(wù)同步執(zhí)行就會(huì)一直卡在做飯的地方,等飯煮好了才能去炒菜。

到此這篇關(guān)于JavaScript中的異步與同步詳解的文章就介紹到這了,更多相關(guān)JavaScript異步與同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Javascript 學(xué)習(xí)筆記之 對(duì)象篇(二) : 原型對(duì)象

    Javascript 學(xué)習(xí)筆記之 對(duì)象篇(二) : 原型對(duì)象

    Javascript 并沒有類繼承模型,而是使用原型對(duì)象 prototype 進(jìn)行原型式繼承。盡管人們經(jīng)常將此看做是 Javascript 的一個(gè)缺點(diǎn),然而事實(shí)上,原型式繼承比傳統(tǒng)的類繼承模型要更加強(qiáng)大。舉個(gè)例子,在原型式繼承頂端構(gòu)建一個(gè)類模型很簡(jiǎn)單,然而反過(guò)來(lái)則是個(gè)困難得多的任務(wù)。
    2014-06-06
  • JS阻止冒泡事件以及默認(rèn)事件發(fā)生的簡(jiǎn)單方法

    JS阻止冒泡事件以及默認(rèn)事件發(fā)生的簡(jiǎn)單方法

    這篇文章主要介紹了JS阻止冒泡事件以及默認(rèn)事件發(fā)生的簡(jiǎn)單方法,有需要的朋友可以參考一下
    2014-01-01
  • javascript中FOREACH數(shù)組方法使用示例

    javascript中FOREACH數(shù)組方法使用示例

    本文給大家介紹的是Array.prototype.forEach()的使用方法示例,希望對(duì)大家學(xué)習(xí)javascript能夠有所幫助。
    2016-03-03
  • javascript瀏覽器兼容教程之事件處理

    javascript瀏覽器兼容教程之事件處理

    如果在使用javascript的時(shí)候涉及到event處理,就需要知道event在不同的瀏覽器中的差異,主要的JavaScript的事件模型有三種(參考《Supporting Three Event Models at Once》),它們分別是NN4、IE4+和W3C/Safar。
    2014-06-06
  • JavaScript基礎(chǔ)語(yǔ)法與數(shù)據(jù)類型介紹

    JavaScript基礎(chǔ)語(yǔ)法與數(shù)據(jù)類型介紹

    這篇文章介紹了JavaScript基礎(chǔ)語(yǔ)法與數(shù)據(jù)類型,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 深入解析JavaScript中的數(shù)字對(duì)象與字符串對(duì)象

    深入解析JavaScript中的數(shù)字對(duì)象與字符串對(duì)象

    這篇文章主要介紹了JavaScript中的數(shù)字對(duì)象與字符串對(duì)象,是JavaScript入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • Javascript的this詳解

    Javascript的this詳解

    這篇文章主要介紹了Javascript的this的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • JavaScript中對(duì)JSON對(duì)象的基本操作示例

    JavaScript中對(duì)JSON對(duì)象的基本操作示例

    JSON格式本就發(fā)自于JavaScript中的對(duì)象和數(shù)組,所以js操作起來(lái)自然也是最為簡(jiǎn)單原始,接下來(lái)我們就來(lái)看一些常用的JavaScript中對(duì)JSON對(duì)象的基本操作示例
    2016-05-05
  • javascript函數(shù)重載解決方案分享

    javascript函數(shù)重載解決方案分享

    本文主要介紹了javascript函數(shù)重載解決方案,利用JavaScript中的特殊對(duì)象arguments來(lái)模擬函數(shù)重載。用它來(lái)判斷傳入?yún)?shù)的個(gè)數(shù)或類型以區(qū)分重載
    2014-02-02
  • JavaScript語(yǔ)言核心數(shù)據(jù)類型和變量使用介紹

    JavaScript語(yǔ)言核心數(shù)據(jù)類型和變量使用介紹

    和眾多編程語(yǔ)言一樣,JavaScript也有自己語(yǔ)言的核心,了解并學(xué)好JavaScript的語(yǔ)言核心部分是JavaScript學(xué)習(xí)道路上非常良好的開始
    2013-08-08

最新評(píng)論

布尔津县| 乌兰县| 贵阳市| 贺州市| 武清区| 赤峰市| 民勤县| 阿拉善右旗| 黑山县| 玛纳斯县| 历史| 漳平市| 邵东县| 雷山县| 宕昌县| 达尔| 西贡区| 屏东市| 南宫市| 高平市| 涿鹿县| 镇原县| 太保市| 上栗县| 沧源| 大理市| 临桂县| 德庆县| 筠连县| 报价| 玉龙| 安福县| 长顺县| 怀化市| 睢宁县| 谢通门县| 连州市| 宝坻区| 塔河县| 怀集县| 鄯善县|