在介紹巨集任務和微任務之前,先丟擲乙個問題。相信大家在面試的時候,會遇到這樣的相似的問題:
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.重複上面三步。只要主線程空了,就會讀取任務列隊,這就是...