gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

完全掌握J(rèn)avaScript執(zhí)行機(jī)制

本篇文章給大家?guī)?lái)了關(guān)于JavaScript執(zhí)行機(jī)制的相關(guān)問(wèn)題,其中包括JavaScript單線程和JavaScript同步異步的相關(guān)知識(shí),希望對(duì)大家有幫助。

完全掌握J(rèn)avaScript執(zhí)行機(jī)制

一、為什么JavaScript是單線程

如果想了解JavaScript為什么是單線程的,我們就要從JavaScript是用來(lái)做什么工作的來(lái)入手。

JavaScript作為瀏覽器的腳本語(yǔ)言,產(chǎn)出的目的就是為了瀏覽器與用戶進(jìn)行交互,操作DOM元素,從而提升用戶的交互及體驗(yàn)感。JavaScript要操作瀏覽器的DOM元素,因此導(dǎo)致JavaScript無(wú)法成為多線程語(yǔ)言,我們假設(shè)一個(gè)場(chǎng)景,如果JavaScript是多線程語(yǔ)言,兩個(gè)線程同時(shí)操作一個(gè)DOM元素,一個(gè)線程需要編輯更新DOM元素,而另一個(gè)則是刪除DOM元素節(jié)點(diǎn),這是瀏覽器應(yīng)該以哪個(gè)為準(zhǔn)呢?

同一時(shí)間只能做同一件事情,因?yàn)椴僮鱀OM元素的原因,導(dǎo)致單線程是JavaScript這門語(yǔ)言的核心,也是這門語(yǔ)言特點(diǎn)。

HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。即使這樣的改動(dòng)也并沒(méi)有改變js單線程的本質(zhì)。

二、JavaScript中的同步與異步

javaScript的單線程機(jī)制,就導(dǎo)致同一時(shí)間只能做一件事情。就像一堆人在ATM取款機(jī)取款,即使后面再多的人在著急,也只能一個(gè)一個(gè)的排隊(duì),等待前一個(gè)人取完款,才能輪到后一人。

可是這樣會(huì)導(dǎo)致如果說(shuō)前一個(gè)任務(wù)消耗時(shí)間過(guò)長(zhǎng),后一個(gè)任務(wù)就會(huì)等待非常久,比如,我們需要加載一個(gè)數(shù)據(jù)量非常大的Ajax請(qǐng)求,我們不得不等待請(qǐng)求相應(yīng)結(jié)果,再繼續(xù)往下行執(zhí)后續(xù)任務(wù)。

那我們?cè)撊绾翁幚磉@種情況呢?既然我們無(wú)法改變JavaScript的單線程機(jī)制,我們是否可以將一些耗時(shí)久的任務(wù)進(jìn)行暫時(shí)掛起,等到主任務(wù)執(zhí)行完成之后,再將這些掛載的任務(wù)執(zhí)行。JavaScript的作者也想到了這樣的方式,JavaScript擁有了同步任務(wù)與異步任務(wù)。

同步任務(wù)就是,任務(wù)在主線程上進(jìn)行排隊(duì),下一個(gè)任務(wù)必須等待上一個(gè)任務(wù)執(zhí)行完成,才可以執(zhí)行。而異步任務(wù)是指,任務(wù)不進(jìn)入主線程,而進(jìn)入任務(wù)隊(duì)列(task queue)進(jìn)行等待,進(jìn)入任務(wù)隊(duì)列的任務(wù)只有"任務(wù)隊(duì)列"通知主線程,某個(gè)異步任務(wù)可以執(zhí)行了,該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。

三、Event Loop事件循環(huán)機(jī)制

JavaScript的所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧。

任務(wù)隊(duì)列是先進(jìn)先出的原則,先進(jìn)隊(duì)列的事件先執(zhí)行,后進(jìn)隊(duì)列的事件后執(zhí)行。

Event Loop

  • 執(zhí)行執(zhí)行棧中的同步任務(wù)。

  • 當(dāng)遇到一個(gè)異步任務(wù)后不會(huì)一直等待其返回結(jié)果,會(huì)先將異步任務(wù)進(jìn)行暫時(shí)掛起,繼續(xù)執(zhí)行其他的同步任務(wù)。

  • 當(dāng)異步任務(wù)有結(jié)果之后,JavaScript會(huì)任務(wù)將添加進(jìn)任務(wù)隊(duì)列中。被添加進(jìn)任務(wù)隊(duì)列中的任務(wù)不會(huì)立刻進(jìn)行回調(diào)執(zhí)行而是等待主線程(執(zhí)行棧)空閑時(shí)才加入到執(zhí)行棧中進(jìn)行回調(diào)執(zhí)行

  • 等待執(zhí)行棧中的任務(wù)執(zhí)行完畢。

  • 將任務(wù)隊(duì)列中的任務(wù)加入執(zhí)行棧后執(zhí)行。

如此反復(fù),這樣就形成了一個(gè)無(wú)限的循環(huán)(event loop)。(下圖來(lái)自網(wǎng)絡(luò))

完全掌握J(rèn)avaScript執(zhí)行機(jī)制

學(xué)習(xí)了 Event Loop 我們一起來(lái)看看下面這道題:

setTimeout(function(){      console.log('setTimeout start')  });  new Promise(function(resolve){      console.log('promise start');      resolve()  }).then(function(){      console.log('promise then')  });  console.log('script end');

嘗試按照,上文我們剛學(xué)到的JavaScript執(zhí)行機(jī)制去分析

1. 首先執(zhí)行同步任務(wù),執(zhí)行到setTimeout,但是setTimeout是異步任務(wù)的暫時(shí)掛起,等待計(jì)時(shí)超時(shí),添加進(jìn)任務(wù)隊(duì)列中。

2. 繼續(xù)往下,在執(zhí)行到new Promise,new Promise里面的是同步任務(wù),打印 "promise start"。

3. 在執(zhí)行到resolve將.then添加進(jìn)任務(wù)隊(duì)列中。

4. 在執(zhí)行 console.log('script end');打印"script end"。

5. 這時(shí)主任務(wù)都已經(jīng)執(zhí)行完成,在將異步任務(wù)添加進(jìn)主任務(wù)中直接執(zhí)行,打印"setTimeout start",再將.then添加進(jìn)主任務(wù)中,打印"promise then"。

所以結(jié)果應(yīng)該是:promise start -> script end -> setTimeout start -> promise then 嗎?

親自在瀏覽器執(zhí)行后,結(jié)果居然不是這樣,而是 promise start -> script end -> promise then -> setTimeout start

宏任務(wù)與微任務(wù)

那為什么上文中的結(jié)果為什么跟我們預(yù)想的不一致,為什么 setTimeout start 會(huì)在 promise 之后打印。

其實(shí)是因?yàn)楫惒降膱?zhí)行也是有先后順序的。其實(shí)用異步跟同步的方式去劃分任務(wù)隊(duì)列的執(zhí)行順序是不準(zhǔn)確的。應(yīng)該劃分為 微任務(wù) 與 宏任務(wù)。

  • 宏任務(wù)(macro-task):script 代碼、setTimeout、setInterval

  • 微任務(wù)(micro-task):Promise、process.nextTick

所以說(shuō)setTimeout是異步任務(wù)中的 宏任務(wù) ,而Promise是異步任務(wù)中的 微任務(wù) 。不管是 微任務(wù) 還是 宏任務(wù),都會(huì)進(jìn)入相應(yīng)的 Event Queue, 接下來(lái)我們?cè)诳匆粋€(gè)流程圖。

完全掌握J(rèn)avaScript執(zhí)行機(jī)制

我們來(lái)稍微理解一下:

  • 1. 執(zhí)行宏任務(wù)(script代碼)

  • 2. 當(dāng)執(zhí)行宏任務(wù)的時(shí)遇到了微任務(wù),就會(huì)將微任務(wù)添加進(jìn) Event Queue

  • 3. 在當(dāng)前宏任務(wù)執(zhí)行完成后,會(huì)查看微任務(wù)的 Event Queue ,并將里面全部的微任務(wù)依次執(zhí)行完

  • 4. 在執(zhí)行玩所有的為微任務(wù)之后,繼續(xù)進(jìn)行第一步,以此循環(huán)

這便也是 javaScript 的運(yùn)行機(jī)制,結(jié)合這個(gè)我們?cè)僦匦碌姆治鲆幌律厦娴睦印?/p>

  • 1. 首先執(zhí)宏任務(wù)(script代碼 ),遇到setTimeout將其添加進(jìn)宏任務(wù)的Event Queue。

  • 2. 繼續(xù)往下,在執(zhí)行到new Promise,打印 "promise start"。

  • 3. 在執(zhí)行到resolve,.then是微任務(wù),添加進(jìn)微任務(wù)的Event Queue。

  • 4. 在執(zhí)行 console.log('script end');打印 "script end"。

  • 5. 到這里本輪的宏任務(wù)就已經(jīng)全部執(zhí)行結(jié)束了,這時(shí)查找微任務(wù)的 Eevent Queue 是否存在可執(zhí)行的微任務(wù), 發(fā)現(xiàn)有剛才在第三步添加進(jìn)去額度.then,執(zhí)行并打印 "promise then"

  • 6. 這時(shí)第一輪的 event loop 就已經(jīng)徹底結(jié)束了,下一輪 event loop 先執(zhí)行一個(gè)宏任務(wù),發(fā)現(xiàn)宏任務(wù)的Event Queue中有添加進(jìn)去的setTimeout,執(zhí)行并打印 "setTimeout start"

永遠(yuǎn)記住JavaScript是單線程,以前是、現(xiàn)在是、將來(lái)也會(huì)是。所有的多線程說(shuō)法都是扯淡。

即使是Event Queue,也只不是實(shí)現(xiàn)異步的方式,也是js的執(zhí)行機(jī)制。

以后能用JavaScript實(shí)現(xiàn)的。都將會(huì)用JavaScript來(lái)實(shí)現(xiàn)。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
特黄特黄一级片| 久无码久无码av无码| 熟女视频一区二区三区| 大桥未久一区二区| 国产精品wwwww| 欧美久久久久久久久久久久久| 五月天综合婷婷| 无限资源日本好片| 欧美成年人视频在线观看| 香蕉精品视频在线| 中文字幕成人免费视频| 国内精品国产三级国产99| 亚洲精品www.| 韩国日本美国免费毛片| 交换做爰国语对白| 日韩成人av免费| 日韩在线综合网| 国产欧美123| 中文字幕精品在线播放| 中文字幕无码精品亚洲35| 69sex久久精品国产麻豆| 丁香色欲久久久久久综合网| 欧美 日韩 国产在线观看| 国产女主播自拍| 亚洲免费av一区二区三区| 欧美 国产 小说 另类| 91av在线免费播放| 黄色a级三级三级三级| 特色特色大片在线| 亚洲天堂av线| 尤物国产在线观看| 公共露出暴露狂另类av| 日韩中文字幕组| 玖玖爱视频在线| 在线观看成人免费| 99热这里只有精品免费| 18禁免费观看网站| 91视频成人免费| 欧美日韩二三区| 午夜久久久久久久久久久| 91免费视频黄| 欧美色图另类小说| 大荫蒂性生交片| 无码人妻丰满熟妇区毛片| 日本男女交配视频| 看av免费毛片手机播放| 欧美国产日韩另类| 97公开免费视频| 免费成人进口网站| 男同互操gay射视频在线看| 亚洲人成无码网站久久99热国产| 97国产精东麻豆人妻电影| 免费网站在线观看视频| 国产av无码专区亚洲精品| 国产极品粉嫩福利姬萌白酱| 成人免费视频91| 亚洲妇熟xx妇色黄蜜桃| 韩国中文字幕av| 国产a级片网站| 日韩精品视频久久| 欧美xxxxx在线视频| 久久久无码中文字幕久...| 红桃视频 国产| 尤物av无码色av无码| 欧美激情亚洲天堂| 青青青青在线视频| 日本77777| 天天视频天天爽| 成人毛片一区二区| 日本一道在线观看| 麻豆传传媒久久久爱| 特级黄色片视频| 51自拍视频在线观看| 日本精品免费在线观看| 手机看片一级片| 日本精品免费视频| 香蕉视频禁止18| 日本wwwcom| 特级西西人体www高清大胆| 国产成人无码精品久久久性色| 日韩a一级欧美一级| 国产日韩一区二区在线观看| 日本黄xxxxxxxxx100| 三上悠亚在线一区二区| 欧美亚洲一二三区| 农民人伦一区二区三区| 四虎4hu永久免费入口| 亚洲精品高清无码视频| 波多野结衣国产精品| 91女神在线观看| 国产aaaaa毛片| 亚洲人成无码www久久久| 国产91在线免费| 国产福利视频在线播放| 国产亚洲精品网站| 成人观看免费完整观看| 已婚少妇美妙人妻系列| 青青青在线视频免费观看| 国产精品69页| 99热手机在线| 久久综合久久网| 男女超爽视频免费播放| 蜜臀一区二区三区精品免费视频 | 黄色一级在线视频| 欧洲精品视频在线| 999一区二区三区| 欧美二区在线视频| 欧美视频免费看欧美视频| 永久免费的av网站| japanese在线播放| 国产欧美日韩小视频| 久久最新免费视频| 国产日韩av网站| 黄www在线观看| 97在线免费公开视频| 97超碰人人爱| 国产欧美激情视频| 国产91沈先生在线播放| 欧美中文字幕在线观看视频| 九色自拍视频在线观看| 青草青青在线视频| 国产一级特黄a大片免费| 午夜免费视频网站| 18岁网站在线观看| 免费超爽大片黄| 欧美成人精品欧美一级乱| 国产第一页视频| 色乱码一区二区三区熟女| 警花观音坐莲激情销魂小说| 国产av人人夜夜澡人人爽麻豆| 成年人网站大全| 国产成人a亚洲精v品无码| 手机免费av片| 91视频福利网| 91免费视频网站在线观看| 欧美激情 国产精品| 日本五级黄色片| 中文字幕22页| 亚洲天堂网一区| 男女私大尺度视频| 亚洲综合在线一区二区| 国产精品999视频| 1314成人网| 成年女人18级毛片毛片免费| 国产资源在线免费观看| 男生操女生视频在线观看| 男人添女荫道口女人有什么感觉| 免费黄频在线观看| 国产中文字幕二区| 毛片一区二区三区四区| 成年人视频大全| 成 年 人 黄 色 大 片大 全| 天天干天天操天天玩| ww国产内射精品后入国产| 亚洲一级片av| 成人黄色一级大片| 超碰影院在线观看| 欧美 日韩 激情| 激情成人开心网| 日韩专区第三页| 妞干网这里只有精品| 中文字幕成人免费视频| 日本男女交配视频| 91视频成人免费| avove在线观看| aaaaaaaa毛片| 日本在线观看免费视频| 国产在线观看福利| 六月激情综合网| 久久久成人精品一区二区三区 | 9l视频白拍9色9l视频| 国产一区二区三区精彩视频| 男人天堂手机在线视频| 91网址在线播放| 日韩视频 中文字幕| 成年在线观看视频| www.xxx麻豆| 国产福利在线免费| 国产精品v日韩精品v在线观看| 成年人免费大片| 99色精品视频| 99久久99久久精品| 可以在线看的av网站| 美女日批免费视频| 五月天av影院| 日产精品久久久久久久蜜臀| 青青草视频在线视频| 久久久久久久久久一区| 五月六月丁香婷婷| 青青在线视频免费观看| 免费黄频在线观看| www.色偷偷.com| 男生操女生视频在线观看| 成年人三级视频| 色婷婷一区二区三区av免费看| 日韩精品视频网址| 男女啪啪免费视频网站| 国产精品国产三级国产专区51| 免费无码毛片一区二三区| 国内外免费激情视频|