亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

JS事件循環機制event loop宏任務微任務原理解析

瀏覽:64日期:2024-04-26 11:07:32

首先看一段代碼

async function (){await f2()console.log(’f1’)}async function f2(){console.log(’f2’)}console.log(’正常1’)f1()setTimeout(()=>{console.log(’定時器’)})console.log(’正常2’)

正確的打印順序應該是:正常1,f2 ,正常2,f1,定時器

為什么會出現這樣打印順序呢

首先javascript是一門單線程語言,在最新的HTML5中提出了Web-Worker,但javascript是單線程這一核心仍未改變。既然js是單線程,那就像只有一個窗口的銀行,客戶需要排隊一個一個辦理業務,同理js任務也要一個一個順序執行。如果一個任務耗時過長,那么后一個任務也必須等著。所以就出現了同步任務和異步任務。

概念

除了廣義的同步任務和異步任務,對任務可以進行更精細的區分

macro-task(宏任務):包括整體代碼script,setTimeout,setInterval micro-task(微任務):Promise,process.nextTick

宏任務:瀏覽器為了能夠使得JS內部task與DOM任務能夠有序的執行,會在一個task執行結束后,在下一個 task 執行開始前,對頁面進行重新渲染 (task->渲染->task->…)

鼠標點擊會觸發一個事件回調,需要執行一個宏任務,然后解析HTMl

微任務:微任務通常來說就是需要在當前 同步任務 執行結束后立即執行的任務,比如對一系列動作做出反饋,或者是需要異步的執行任務而又不需要分配一個新的任務,這樣便可以減小一點性能的開銷。

既然我們清楚了概念,我們再看一遍代碼

async function (){await f2()console.log(’f1’)}async function f2(){console.log(’f2’)}console.log(’正常1’)f1()setTimeout(()=>{console.log(’定時器’)})console.log(’正常2’)

執行順序

首先我們進行正常的同步流程,打印出‘正常1’,接下來執行f1()函數,await后面的函數f2()會立即執行,所以會打印’f2’,繼續執行同步代碼打印‘正常2’,至此同步任務全部結束,開始執行異步任務微任務,await f2()等待f2()方法執行完之后打印出f1,最后執行宏任務setTimeout打印‘定時器’

這就是為什么‘正常1’,正常2’會打印在‘f1’之前,因為所有微任務執行的時候,當前執行棧的代碼必須已經執行完畢。‘f2’,’f1’會打印在‘定時器’之前是因為所有微任務總會在下一個宏任務之前全部執行完畢

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 好爽好深好猛好舒服视频上 | 久热精品视频在线观看99小说 | 中文字幕日韩一区二区三区不卡 | 日韩 欧美 中文字幕 不卡 | 国产一区二区三区四区在线污 | www.成人网.com| 国产三香港三韩国三级不卡 | 国产三级在线观看播放 | 成年视频xxxxxx在线 | 黄色网页在线播放 | 中文字幕欧美日韩一 | 一级一片在线播放在线观看 | 欧美日韩中文字幕在线视频 | 久久机热一这里只精品 | 18在线网站 | 日韩天天摸天天澡天天爽视频 | 中国精品久久精品三级 | 最新97超级碰碰碰碰久久久久 | 国产在线观看91精品2021 | 九九精品免视频国产成人 | 中文字幕日本精品一区二区三区 | 日韩综合第一页 | 污污的视频在线播放 | 六月婷婷中文字幕 | 精品夜夜春夜夜爽久久 | 一级黄色免费网站 | 国产黄在线观看免费观看软件视频 | 国产色视频在线观看免费 | 欧州一级毛片 | 国产综合区| 久久综合九色婷婷97 | 韩国女主播精品一区二区 | 久久成人视 | 久久综合一本 | 美女zw喷水视频在线观看 | 91在线欧美精品观看 | 三级很黄很黄的视频 | 日韩一级一欧美一级国产 | 国产一级一片免费播放 | 色综合久久加勒比高清88 | 精品美女视频在线观看2023 |