亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript中的事件循環(huán)方式

 更新時(shí)間:2022年07月28日 14:10:42   作者:尼克_張  
這篇文章主要介紹了JavaScript中的事件循環(huán)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

js是單線程,非阻塞,試想如果是多線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程。

js的事件循環(huán)分為主線程(同步)和任務(wù)隊(duì)列(異步),任務(wù)隊(duì)列里又分為宏任務(wù)和微任務(wù)

1.宏任務(wù)(macro-task):

script(整體代碼),setTimeout,setInterval,setImmediate。

優(yōu)先級(jí): setImmediate > setTimeout / setInterval 

2.微任務(wù)(micro-task):

Promise,mutationObserve(觀察DOM樹結(jié)構(gòu)發(fā)生變化時(shí),做出相應(yīng)處理),process.nextTick(Node.js 環(huán)境)。

優(yōu)先級(jí):process.nextTick > Promise > MutationObserver

概述原理

同步>微任務(wù)>宏任務(wù)

1.宏任務(wù)、微任務(wù)都是任務(wù)隊(duì)列,一段代碼執(zhí)行時(shí),會(huì)先執(zhí)行宏任務(wù)中的同步代碼。

2.進(jìn)行第一輪事件循環(huán)的時(shí)候會(huì)把js腳本當(dāng)成一個(gè)宏任務(wù)來運(yùn)行。

3.如果執(zhí)行中遇到setTimeout之類宏任務(wù),那么就把這個(gè)setTimeout內(nèi)部的函數(shù)推入宏任務(wù)的隊(duì)列中,下一輪宏任務(wù)執(zhí)行時(shí)調(diào)用。

4.如果執(zhí)行中遇到 promise.then() 之類的微任務(wù),就會(huì)推入到微任務(wù)隊(duì)列中,在本輪宏任務(wù)的同步代碼都執(zhí)行完成后,依次執(zhí)行所有的微任務(wù)。

5.當(dāng)執(zhí)行完全部的同步腳本以及微任務(wù)隊(duì)列中的事件,這一輪循環(huán)就結(jié)束了,開始第二輪循環(huán),依次循環(huán)往復(fù)。

案例解析

<script>
setTimeout(() => {
    console.log('4')
}, 100)
new Promise((resolve) => {
    console.log('1')
    resolve("成功")
}).then(data => {
    console.log(data)
})
console.log('2')
</script>

解析

1.這段代碼作為宏任務(wù),進(jìn)入主線程。

2.先遇到setTimeout之類宏任務(wù),那么就把這個(gè)setTimeout內(nèi)部的函數(shù)推入宏任務(wù)的隊(duì)列中,下一輪宏任務(wù)執(zhí)行時(shí)調(diào)用。

3.接下來遇到了Promise,同步代碼立即執(zhí)行,回調(diào)函數(shù)分發(fā)到微任務(wù)隊(duì)列中。

4.遇到console.log(‘2’),立即執(zhí)行,查看有無微任務(wù),有一個(gè)then的回調(diào)函數(shù),立即執(zhí)行。

5.第一輪宏任務(wù)執(zhí)行結(jié)束。

6.開始第二輪宏任務(wù),執(zhí)行宏任務(wù)中的setTimeout函數(shù)。

將以上代碼升級(jí)下:

setTimeout(() => {
    console.log('1') 
}, 1000)
new Promise((resolve) => {
    console.log('2') 
    setTimeout((params) => {
        resolve("4")
        console.log("3"); 
    }, 100)
}).then(data => {
    console.log(data) 
})
console.log('5') 

能否先將promise.then分發(fā)到微任務(wù)中?

答案是不能,因?yàn)橹挥衦esolve成功回調(diào)之后才能執(zhí)行.then,而現(xiàn)在resolve在setTimeout宏任務(wù)中,只有等setTimeout執(zhí)行完之后才能執(zhí)行.then中的微任務(wù) 

解析

1.這段代碼作為宏任務(wù),進(jìn)入主線程。

2.先遇到等待時(shí)間為1000ms的setTimeout,記為s1,并且把這個(gè)setTimeout內(nèi)部的函數(shù)推入宏任務(wù)的隊(duì)列中,下一輪宏任務(wù)執(zhí)行時(shí)調(diào)用。

3.接下來遇到了Promise,同步代碼立即執(zhí)行,但其內(nèi)部包含一個(gè)等待時(shí)間為100ms的setTimeout,記為s2,并且promise的resolve也在其中,也把它放在下一輪的宏任務(wù)中。

4.遇到console.log(‘5’),立即執(zhí)行。

5.第一輪宏任務(wù)執(zhí)行結(jié)束。查看當(dāng)前有沒有可執(zhí)行的微任務(wù),沒有則執(zhí)行宏任務(wù)。

6.開啟第二輪宏任務(wù),發(fā)現(xiàn)有兩個(gè)宏任務(wù),比較等待時(shí)間長短,時(shí)間短的先執(zhí)行,先執(zhí)行s2,發(fā)現(xiàn)其中有微任務(wù)promise.then,立即執(zhí)行,再執(zhí)行s1。

最后的執(zhí)行順序?yàn)? 5 3 4 1

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 提取字符串中年月日的函數(shù)代碼

    提取字符串中年月日的函數(shù)代碼

    提取字符串中年月日的函數(shù)代碼,需要的朋友可以過來參考下。希望對(duì)大家有所幫助
    2013-11-11
  • JavaScript中的typeof操作符用法實(shí)例

    JavaScript中的typeof操作符用法實(shí)例

    在Web前端開發(fā)中,我們經(jīng)常需要判斷變量的數(shù)據(jù)類型。鑒于ECMAScript是松散類型的,因此需要有一種手段來檢測(cè)給定變量的數(shù)據(jù)類型——typeof就是負(fù)責(zé)提供這方便信息的操作符。
    2014-04-04
  • JavaScript reduce的基本用法詳解

    JavaScript reduce的基本用法詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript reduce的基本用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • addEventListener和attachEvent二者綁定的執(zhí)行函數(shù)中的this不相同

    addEventListener和attachEvent二者綁定的執(zhí)行函數(shù)中的this不相同

    寫 addEventListener 和 attachEvent 區(qū)別的博文不少,不過大部分都把重點(diǎn)放置于前者是Firefox chrome,后者只是存在于IE系列中
    2012-12-12
  • 分享javascript實(shí)現(xiàn)的冒泡排序代碼并優(yōu)化

    分享javascript實(shí)現(xiàn)的冒泡排序代碼并優(yōu)化

    本文給大家匯總介紹了幾個(gè)個(gè)人收藏的JavaScript實(shí)現(xiàn)冒泡排序的代碼,都是非常的不錯(cuò),有需要的小伙伴可以參考下
    2016-06-06
  • 表單元素的submit()方法和onsubmit事件應(yīng)用概述

    表單元素的submit()方法和onsubmit事件應(yīng)用概述

    表單元素?fù)碛衧ubmit方法,同時(shí)也具有onsubmit事件句柄,用于監(jiān)聽表單提交??梢允褂胑lemForm.submit();方法觸發(fā)表單提交,感興趣的朋友可以了解下,或許對(duì)你有所幫助
    2013-02-02
  • 深入了解JavaScript中的Symbol的使用方法

    深入了解JavaScript中的Symbol的使用方法

    這篇文章主要介紹了深入了解JavaScript中的Symbol的使用方法,本文針對(duì)ES6版本的JS進(jìn)行講解,需要的朋友可以參考下
    2015-07-07
  • 裁剪字符串trim()自定義改進(jìn)版

    裁剪字符串trim()自定義改進(jìn)版

    下面講述的是自定義trim()函數(shù)遇到的問題,改進(jìn)的過程,建議在支持的瀏覽器中使用原生函數(shù)
    2013-04-04
  • JavaScript入門之對(duì)象與JSON詳解

    JavaScript入門之對(duì)象與JSON詳解

    JSON是JavaScript中對(duì)象的字面量,是對(duì)象的表示方法,通過使用JSON,可以減少中間變量,使代碼的結(jié)構(gòu)更加清晰,也更加直觀。使用JSON,可以動(dòng)態(tài)的構(gòu)建對(duì)象,而不必通過類來進(jìn)行實(shí)例化,大大的提高了編碼的效率
    2011-10-10
  • 詳解Javascript ES6中的箭頭函數(shù)(Arrow Functions)

    詳解Javascript ES6中的箭頭函數(shù)(Arrow Functions)

    箭頭函數(shù),若有了解過coffeeScript的同學(xué),或許對(duì)此印象深刻,因?yàn)樗梢宰屨Z法省略不少,特別是對(duì)于回調(diào)函數(shù),會(huì)讓代碼更清晰簡(jiǎn)潔。下面讓我們一起來學(xué)習(xí)學(xué)習(xí)ES6中的箭頭函數(shù)。
    2016-08-08

最新評(píng)論