日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

我理解的javascript事件循环(一)

發布時間:2025/4/5 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我理解的javascript事件循环(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

javascript事件循環分為2種:一種是瀏覽器端事件循環,一種是node端事件循環。 此文只是捋一捋我對瀏覽器端事件循環的理解。

前言

我們都知道 JavaScript 是一門單線程語言,這意味著同一時間只能執行一個任務,結束了才能去執行下一個。如果前面的任務沒有執行完,后面的任務就會一直等待。試想,有一個耗時很長的網絡請求,如果所有任務都需要等待這個請求完成才能繼續,顯然是不合理的并且我們在瀏覽器中也沒有體驗過這種情況(除非你要同步請求 Ajax),究其原因,是 JavaScript 借助異步機制來實現了任務的調度。

JavaScript 常見的異步有3種:ajax、dom事件(button的點擊事件等)、定時器(setTimeout等)。

舉個例子

console.log("A");setTimeout(() => {console.log("B"); }, 100);console.log("C"); 復制代碼

稍微了解一點瀏覽器中異步機制的同學都能答出會輸出 “A C B”,我們來通過分析 event loop 來對瀏覽器中的異步進行梳理,并搞清上面的問題。

從上圖我們可以看出js分為3個部分:stack(主線程)、WebAPIs、event loop。

瀏覽器的執行順序是:

1.先執行主線程,即

console.log("A");setTimeout(() => {console.log("B"); }, 100);console.log("C"); 復制代碼

程序從上往下執行,但是執行到setTimeout時,只是注冊了一個WebAPIs事件,并不會執行setTimeout的回調函數。 此回調函數是異步的,會在主線程的所有程序執行完畢后根據注冊的時間才執行。

2.當主程序執行完畢后,就執行event loop。當然callback queue一開始是空的。event loop是一個‘死循環’,它會一遍又一遍的去檢測WebAPIs有沒有可執行的回調函數,有就把回調函數放入自身的callback queue并執行,沒有的話繼續下一次循環。

3.瀏覽器監聽WebAPIs事件。過了100ms定時器事件觸發了,它會通知event loop有可執行的回調函數了。

事件循環的一個必須條件是 執行棧中的任務執行完畢才會執行 “任務隊列”中的任務,如果執行棧一直處于執行不完的情況,也就沒有任務隊列什么事了。所以我們的settimeout 后面的參數其實是不準確的,他開始算的時間應該是執行棧的任務執行完畢。

settimeout還有一個最小時間4ms的規定,所以當我們寫settimeout(function(){},0)時,其中的0其實是4ms。

微任務和宏任務

首先說明,是以__瀏覽器為處理環境__下的執行邏輯 瀏覽器環境下的微任務和宏任務有哪些 宏任務:setTimeout setImmediate MessageChannel 微任務:Promise.then MutationObserver 記住兩點:

  • 微任務在宏任務之前的執行,先執行 執行棧中的內容 執行后 清空微任務
  • 每次取一個宏任務 就去清空微任務,之后再去取宏任務

題目

setTimeout(function(){console.log('setTimeout1');Promise.resolve().then(()=>{console.log('then1');}); },0) Promise.resolve().then(()=>{console.log('then2');Promise.resolve().then(()=>{console.log('then3');})setTimeout(function(){console.log('setTimeout2');},0) }) 復制代碼
  • 微任務宏任務同時出現,先將微任務放入執行隊列,棧為空則先執行then2。setTimeout1放入宏任務執行隊列中
  • then2之后執行后,接下來存在微任務then3。將then3放入微任務隊列中。
  • 接下來setTimeout2加入到宏任務隊列中。
  • 此時執行棧為空,執行then3。
  • 微任務全部執行完畢后,執行宏任務setTimeout1,執行發現微任務then1,放置到微任務隊列中。
  • setTimeout1宏任務執行完,再次清空微任務隊列,執行then1
  • 微任務全部執行完畢后,執行宏任務setTimeout2。程序結束。

總結

以上是生活随笔為你收集整理的我理解的javascript事件循环(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中日精品一色哟哟 | 黑丝久久 | 天天综合视频 | 四虎黄色片 | 在线观看免费大片 | 欧美福利专区 | 99精品免费观看 | 丝袜美腿中文字幕 | 穿越异世荒淫h啪肉np文 | 一色桃子juy758在线播放 | 久久综合干 | 免费av播放| 182在线视频 | 午夜怡红院 | 免费观看在线播放 | 国产91页 | 国产欧美视频在线 | xfplay5566色资源网站 | av黄色在线播放 | 91porny在线 | 免费又黄又爽又猛大片午夜 | 男人天堂网站 | 蜜桃成熟时李丽珍在线观看 | 免费av成人 | 欧美啪啪小视频 | 精品国产乱码久久久久久婷婷 | 在线免费激情视频 | 亚洲久草视频 | 一级黄色a毛片 | 免费av网站观看 | 日本三级视频在线播放 | 日韩专区欧美专区 | 哪个网站可以看毛片 | 影音先锋伦理片 | 国产小视频免费在线观看 | 神马久久精品 | 亚洲av男人的天堂在线观看 | 日韩毛片无码永久免费看 | 久久99精品久久久 | 色婷婷综合久久久久中文 | 免费黄色一区二区 | 香蕉网在线视频 | 日本xxxx免费 | 精品www久久久久久奶水 | jizzjizzjizz亚洲| 奶妈的诱惑 | 日韩电影一区二区在线观看 | 激情小说专区 | 日韩精品91 | 国产三级久久久久 | 亚洲AV成人午夜无码精品久久 | 一区二区精品视频 | 日干夜干天天干 | 丰满熟女一区二区三区 | 91国在线视频 | av导航在线| 网站在线播放 | 在线观看你懂的网站 | 麻豆视频网址 | 五月婷婷天 | 森泽佳奈作品在线观看 | 91精品国| 污漫网站| 中文字幕av资源 | 丁香六月在线 | 亚洲成人999 | 在线射 | 又黄又爽网站 | 久久依人网 | 蜜臀精品 | 四虎成人永久免费视频 | 欧美一区二区三区在线观看视频 | 美女隐私无遮挡免费 | 免费黄片毛片 | 波多野结衣丝袜 | 中国黄色a级 | 九九九免费 | 视频一区二区视频 | 午夜在线你懂的 | 国产又粗又猛又爽又黄的视频在线观看动漫 | 美国色综合 | 中文字幕一本 | 91精品国产一区二区三区香蕉 | 巨茎大战刘亦菲 | 白嫩少妇激情无码 | 日韩v | 日本在线视频中文字幕 | 日韩欧美在线看 | 91九色蝌蚪 | 婷婷开心激情 | 无码一区二区三区在线观看 | 黄色自拍视频 | 国产男人的天堂 | 国产精品久久久久三级无码 | 一二三区在线视频 | 久久久久久久毛片 | 国内自拍欧美 | 欧美18一20男同69gay | 国产99久久久国产精品成人免费 |