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

站長資訊網
最全最豐富的資訊網站

完全掌握JavaScript執行機制

本篇文章給大家帶來了關于JavaScript執行機制的相關問題,其中包括JavaScript單線程和JavaScript同步異步的相關知識,希望對大家有幫助。

完全掌握JavaScript執行機制

一、為什么JavaScript是單線程

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

JavaScript作為瀏覽器的腳本語言,產出的目的就是為了瀏覽器與用戶進行交互,操作DOM元素,從而提升用戶的交互及體驗感。JavaScript要操作瀏覽器的DOM元素,因此導致JavaScript無法成為多線程語言,我們假設一個場景,如果JavaScript是多線程語言,兩個線程同時操作一個DOM元素,一個線程需要編輯更新DOM元素,而另一個則是刪除DOM元素節點,這是瀏覽器應該以哪個為準呢?

同一時間只能做同一件事情,因為操作DOM元素的原因,導致單線程是JavaScript這門語言的核心,也是這門語言特點。

HTML5提出Web Worker標準,允許JavaScript腳本創建多個線程,但是子線程完全受主線程控制,且不得操作DOM。即使這樣的改動也并沒有改變js單線程的本質。

二、JavaScript中的同步與異步

javaScript的單線程機制,就導致同一時間只能做一件事情。就像一堆人在ATM取款機取款,即使后面再多的人在著急,也只能一個一個的排隊,等待前一個人取完款,才能輪到后一人。

可是這樣會導致如果說前一個任務消耗時間過長,后一個任務就會等待非常久,比如,我們需要加載一個數據量非常大的Ajax請求,我們不得不等待請求相應結果,再繼續往下行執后續任務。

那我們該如何處理這種情況呢?既然我們無法改變JavaScript的單線程機制,我們是否可以將一些耗時久的任務進行暫時掛起,等到主任務執行完成之后,再將這些掛載的任務執行。JavaScript的作者也想到了這樣的方式,JavaScript擁有了同步任務與異步任務。

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

三、Event Loop事件循環機制

JavaScript的所有同步任務都在主線程上執行,形成一個執行棧。

任務隊列是先進先出的原則,先進隊列的事件先執行,后進隊列的事件后執行。

Event Loop

  • 執行執行棧中的同步任務。

  • 當遇到一個異步任務后不會一直等待其返回結果,會先將異步任務進行暫時掛起,繼續執行其他的同步任務。

  • 當異步任務有結果之后,JavaScript會任務將添加進任務隊列中。被添加進任務隊列中的任務不會立刻進行回調執行而是等待主線程(執行棧)空閑時才加入到執行棧中進行回調執行

  • 等待執行棧中的任務執行完畢。

  • 將任務隊列中的任務加入執行棧后執行。

如此反復,這樣就形成了一個無限的循環(event loop)。(下圖來自網絡)

完全掌握JavaScript執行機制

學習了 Event Loop 我們一起來看看下面這道題:

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');

嘗試按照,上文我們剛學到的JavaScript執行機制去分析

1. 首先執行同步任務,執行到setTimeout,但是setTimeout是異步任務的暫時掛起,等待計時超時,添加進任務隊列中。

2. 繼續往下,在執行到new Promise,new Promise里面的是同步任務,打印 "promise start"。

3. 在執行到resolve將.then添加進任務隊列中。

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

5. 這時主任務都已經執行完成,在將異步任務添加進主任務中直接執行,打印"setTimeout start",再將.then添加進主任務中,打印"promise then"。

所以結果應該是:promise start -> script end -> setTimeout start -> promise then 嗎?

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

宏任務與微任務

那為什么上文中的結果為什么跟我們預想的不一致,為什么 setTimeout start 會在 promise 之后打印。

其實是因為異步的執行也是有先后順序的。其實用異步跟同步的方式去劃分任務隊列的執行順序是不準確的。應該劃分為 微任務 與 宏任務。

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

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

所以說setTimeout是異步任務中的 宏任務 ,而Promise是異步任務中的 微任務 。不管是 微任務 還是 宏任務,都會進入相應的 Event Queue, 接下來我們在看一個流程圖。

完全掌握JavaScript執行機制

我們來稍微理解一下:

  • 1. 執行宏任務(script代碼)

  • 2. 當執行宏任務的時遇到了微任務,就會將微任務添加進 Event Queue

  • 3. 在當前宏任務執行完成后,會查看微任務的 Event Queue ,并將里面全部的微任務依次執行完

  • 4. 在執行玩所有的為微任務之后,繼續進行第一步,以此循環

這便也是 javaScript 的運行機制,結合這個我們再重新的分析一下上面的例子。

  • 1. 首先執宏任務(script代碼 ),遇到setTimeout將其添加進宏任務的Event Queue。

  • 2. 繼續往下,在執行到new Promise,打印 "promise start"。

  • 3. 在執行到resolve,.then是微任務,添加進微任務的Event Queue。

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

  • 5. 到這里本輪的宏任務就已經全部執行結束了,這時查找微任務的 Eevent Queue 是否存在可執行的微任務, 發現有剛才在第三步添加進去額度.then,執行并打印 "promise then"

  • 6. 這時第一輪的 event loop 就已經徹底結束了,下一輪 event loop 先執行一個宏任務,發現宏任務的Event Queue中有添加進去的setTimeout,執行并打印 "setTimeout start"

永遠記住JavaScript是單線程,以前是、現在是、將來也會是。所有的多線程說法都是扯淡。

即使是Event Queue,也只不是實現異步的方式,也是js的執行機制。

以后能用JavaScript實現的。都將會用JavaScript來實現。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产亚洲欧美在线视频| 热这里只有精品| 在线观看的毛片| 一级淫片在线观看| 国内精品国产三级国产99| 午夜免费福利小电影| 大肉大捧一进一出好爽动态图| 免费在线观看的毛片| 91国产精品视频在线观看| 国产午夜精品视频一区二区三区| 97视频在线免费| 久久国产精品免费观看| 免费看a级黄色片| 久艹在线免费观看| 中文字幕在线视频一区二区三区| 欧美日韩一道本| 久久久久久免费看| 久久www视频| 欧美另类videosbestsex日本| 国产精品拍拍拍| 天天色综合天天色| youjizzxxxx18| 北条麻妃av高潮尖叫在线观看| 亚洲中文字幕无码专区| 国产毛片久久久久久国产毛片| 吴梦梦av在线| 99久久久精品视频| 国产免费黄色小视频| 国产二区视频在线| 亚洲精品乱码久久久久久自慰| jizzjizzxxxx| 色91精品久久久久久久久| 老司机午夜性大片| 国产www免费| 成人三级视频在线播放| 波多野结衣国产精品| 日本老太婆做爰视频| 国产黄色一级网站| 午夜免费福利网站| 伊人再见免费在线观看高清版| 色中文字幕在线观看| 国产原创popny丨九色| 精品少妇无遮挡毛片| 超薄肉色丝袜足j调教99| 黄色av免费在线播放| 热99这里只有精品| 一区二区久久精品| 黄色手机在线视频| 337p粉嫩大胆噜噜噜鲁| 一本之道在线视频| 国产精品嫩草影院8vv8| 免费观看日韩毛片| 成人亚洲精品777777大片| www精品久久| 国产精品免费入口| 免费在线观看的av网站| 国产精品一色哟哟| 中国丰满熟妇xxxx性| 国产精品久久久久久9999| 日本黄色的视频| 国产无遮挡猛进猛出免费软件| 亚洲三级视频网站| 宅男噜噜噜66国产免费观看| 亚洲不卡视频在线| www日韩视频| 182午夜视频| 成人在线视频一区二区三区| 亚洲一级片免费观看| 久久久久久久久久伊人| 日本十八禁视频无遮挡| 在线观看免费不卡av| 在线观看污视频| 色婷婷综合久久久久中文字幕| av动漫免费看| 国产亚洲精品久久久久久久| 免费看日b视频| 浓精h攵女乱爱av| 真实国产乱子伦对白视频| 日韩一级在线免费观看| av磁力番号网| wwwwxxxx日韩| av动漫在线免费观看| 国产福利在线免费| 成人免费观看毛片| 好吊妞无缓冲视频观看| 女同性恋一区二区| 天堂网在线免费观看| 青青青在线播放| 久久99久久99精品| 国产人妻互换一区二区| 天天爱天天做天天操| 青少年xxxxx性开放hg| 黄色网址在线免费看| 加勒比av中文字幕| 午夜av中文字幕| 在线免费黄色小视频| 色哟哟免费网站| 国产精彩视频一区二区| 黄色网页免费在线观看| 777777av| 男人搞女人网站| 久久久久久久久久久久久久久国产| 欧美三级午夜理伦三级| 玖玖爱视频在线| 国产免费一区二区视频| 国内外免费激情视频| 日韩欧美理论片| 国产原创中文在线观看| 亚洲欧美激情网| 青青在线视频免费观看| 污网站在线免费| mm1313亚洲国产精品无码试看| 日韩一级免费片| 中文字幕视频在线免费观看| 国产精品久久久影院| 欧美专区第二页| 色免费在线视频| 99re精彩视频| 网站一区二区三区| 人妻无码视频一区二区三区| 久久观看最新视频| 欧美黄网在线观看| 男女啪啪免费观看| 17c丨国产丨精品视频| 久久国产午夜精品理论片最新版本| 免费看污黄网站| 性生活免费在线观看| www欧美激情| 裸体大乳女做爰69| 成人污网站在线观看| 成人国产一区二区三区| 草b视频在线观看| 999精品视频在线| 午夜不卡福利视频| 欧美极品少妇无套实战| 日本韩国欧美在线观看| 日日噜噜夜夜狠狠| 中文字幕精品在线播放| 国产av国片精品| 九九久久久久久| 国产午夜伦鲁鲁| 国产 porn| 中文字幕日本最新乱码视频| 欧美成人三级在线播放| 给我免费播放片在线观看| 色播五月综合网| 成年人在线看片| 蜜臀av无码一区二区三区| 国产成年人在线观看| 久久久久国产一区| 成人免费在线小视频| av不卡在线免费观看| 欧美女同在线观看| 久久久久久香蕉| av五月天在线| 国产三级日本三级在线播放| 亚洲熟妇无码一区二区三区| 91大学生片黄在线观看| 激情五月婷婷六月| 无罩大乳的熟妇正在播放| 成年人网站国产| 国产一级大片免费看| 大桥未久一区二区| 91亚洲精品国产| 亚洲免费av一区二区三区| 乱子伦视频在线看| 久久久一二三四| 无码专区aaaaaa免费视频| 日日摸日日碰夜夜爽av| 日本激情视频在线播放| 黄色网络在线观看| 欧美日韩二三区| 中文字幕第17页| 久久久999免费视频| 欧美日韩在线免费播放| 三级黄色片免费看| 无码无遮挡又大又爽又黄的视频| 免费在线观看的毛片| a级片一区二区| 激情视频小说图片| 欧美日韩大尺度| 男人用嘴添女人下身免费视频| 亚洲免费999| 国产又大又黄又猛| 久久精品视频91| 欧美牲交a欧美牲交aⅴ免费下载| 干日本少妇视频| 欧美性视频在线播放| 日韩va在线观看| 91 视频免费观看| 免费看啪啪网站| 久久久无码中文字幕久...| 久久久久久久久久久久久久久国产| 日韩国产一级片| 妺妺窝人体色www在线小说| 国产午夜伦鲁鲁| 欧美黑人又粗又大又爽免费| 国产女女做受ⅹxx高潮| 手机av在线免费| 色哟哟免费网站|