Event Loop我知道,巨集任務微任務是什麼鬼?

2022-10-09 17:33:10 字數 1127 閱讀 1041

在介紹巨集任務和微任務之前,先丟擲乙個問題。相信大家在面試的時候,會遇到這樣的相似的問題:

settimeout(function()).then(function(){undefined

console.log(『3』)

console.log(『4』);

請說出控制台列印的資料,很多小夥伴經過深思熟慮之後,會自信的說出答案:2、4、1、3。

但是說出答案之後往往會發現面試官並沒有出現很滿意的表情。這是為什麼呢?接下來讓我們一步一步的**面試官不滿意的原因。

j**ascript事件迴圈機制

首先還是說說j**ascript的事件迴圈機制,大家都知道,js的執行任務分為同步任務和非同步任務,那麼他們的執**況是怎麼樣的尼?執行的時候,會優先執行同步任務,當執行中遇到了非同步任務,會暫時將非同步任務扔到非同步佇列中,繼續執行後面的同步任務。當所有的同步任務執行完成之後,再執行剛才扔在非同步佇列中的任務。一直迴圈執行,也就形成了我們j**ascript的event loop機制。

可能純文字的介紹大家看得有點繞,下面引入一張來幫助大家理解j**ascript事件迴圈機制:

在這裡插入描述

看完這個圖,各位小夥伴可能會覺得,我上面的答案沒有問題呀,是正確的呀!但是事情並不是那麼的簡單,接下來引入兩個新概念:巨集任務(macrotask)和微任務(microtask)

巨集任務(macrotask)和微任務(microtask)

巨集任務和微任務表示的是非同步任務的兩種分類。在瀏覽器js引擎載入js**的時候,會將所有的**以任務的形式分別分配到這兩個分類的佇列中。然後首先會從巨集任務的任務佇列中中取出一條任務執行;當執行完畢之後再將微任務佇列裡面的所有的任務按照順序執行;當所有的微任務佇列任務執行完畢之後,再去巨集任務佇列中取出一條任務執行。

巨集任務主要有:整體script**、settimeout、setinterval、i/o、requestanimationframe

微任務主要有:promise、process.nexttick、mutationobserver

微任務,巨集任務,事件迴圈(Event Loop)

最近遇到了事件迴圈的問題,於是決定好好的研究一番。看了一篇文章感覺講的特別好。我們都知道event loop的執行順序是 執行巨集任務 該巨集任務產生的微任務,若微任務執行中產生了新的微任務,則繼續執行微任務,微任務執行完畢,再回到巨集任務進行下一輪迴圈。後來自己也看了很多例子,但是疑惑點是,對於p...

瀏覽器中的 Event Loop,巨集任務與微任務

當我們執行 js 的時候其實就是往執行棧中放入函式,那麼遇到非同步 的時候該怎麼辦?其實當遇到非同步的 時,會被掛起並在需要執行的時候加入到 task 有多種 task 佇列中。一旦執行棧為空,event loop 就會從 task 佇列中拿出需要執行的 並放入執行棧中執行,所以本質上來說 js 中...

任務列隊和event loop(事件迴圈)

1.所有的同步任務都在主線程上執行,行成乙個執行棧。2.除了主線程之外,還存在乙個任務列隊,只要非同步任務有了執行結果,就在任務列隊中植入乙個時間標記。3.主線程完成所有任務 執行棧清空 就會讀取任務列隊,先執行微任務佇列在執行巨集任務佇列。4.重複上面三步。只要主線程空了,就會讀取任務列隊,這就是...