最新国产好看的视频,伊人天堂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就是一門單線程語言,需要的朋友可以參考下

基本概念

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

單線程:

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

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

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

圖解:

在這里插入圖片描述

代碼演示:

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既然是單線程語言,那么為什么同時(shí)可以執(zhí)行多個(gè)任務(wù)(同時(shí)煮飯炒菜)?

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

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

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

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

補(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ù)都是誰先進(jìn)入隊(duì)列誰先執(zhí)行。

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

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

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

相關(guān)文章

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

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

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

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

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

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

    本文給大家介紹的是Array.prototype.forEach()的使用方法示例,希望對大家學(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ǔ)語法與數(shù)據(jù)類型介紹

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

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

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

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

    Javascript的this詳解

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

    JavaScript中對JSON對象的基本操作示例

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

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

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

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

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

最新評(píng)論

连城县| 谢通门县| 浦江县| 江城| 沽源县| 安国市| 唐河县| 景泰县| 南丹县| 辰溪县| 乌拉特后旗| 宜都市| 巢湖市| 那曲县| 淮南市| 柏乡县| 新邵县| 宣汉县| 吉林省| 绵阳市| 玛曲县| 沙雅县| 民和| 连城县| 鹤山市| 桐乡市| 鄯善县| 姜堰市| 大同市| 安平县| 德惠市| 元朗区| 湘西| 大足县| 泗水县| 华坪县| 博白县| 汉寿县| 五寨县| 衡南县| 鹤山市|