成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

前端開發JS:事件循環機制、調用棧以及任務隊列

開發 開發工具 前端
在之前,我只是簡單地認為由于函數執行很快,setTimeout執行時間即便為0也不會馬上輸出,而是等待函數執行完后再輸出。實際上其運行機制就是js中的事件循環機制,在這個循環機制中呢,又與call Stack和task queue有關。

js里的事件循環機制十分有趣。從很多面試題也可以看出來,考察簡單的setTimeout也就是考察這個機制的。

在之前,我只是簡單地認為由于函數執行很快,setTimeout執行時間即便為0也不會馬上輸出,而是等待函數執行完后再輸出。這只對了一半。

實際上其運行機制就是js中的事件循環機制,在這個循環機制中呢,又與call Stack和task queue有關。

[[190124]]

一、js事件循環機制

事件循環機制呢,簡單點來說,就是在執行上下文的過程中,對函數的入棧和出棧。執行前函數先入棧,執行完后函數出棧。如若遇到了一些異步操作像回調函數以及ajax、setTimeout等,會先將他們交給瀏覽器的其他模塊去執行,執行完后,會把回調函數放入到taskqueue中。當所有的call stack執行完后再開始執行task queue中的函數。

舉一個簡單的例子:

  1. console.log(1);  
  2. setTimeout(function() 

我們來看一下執行的內部過程

1. 執行***句,放入call stack中,輸出 1

js事件循環機制

2. ***句出棧,執行第二句,由于是異步執行,交給其他模塊。

js事件循環機制

3. 執行完后,將回調函數放入taskqueue中

js事件循環機制

4. 執行下一句,同***步一樣,將語句入棧并執行,輸出3

js事件循環機制

5. 語句出棧,此時call stack空了。開始執行task queue任務,輸出2

js事件循環機制

所以,輸出結果是

js事件循環機制

與預想一致。

二、進階

如果添加了Promise又如何工作呢?

我們知道,Promise的回調函數不是傳入的,而是使用then來調用的。因此,Promise中定義的函數應該是馬上執行的,then才是其回調函數,放入queue隊列中。

還提到了一個重要的概念:

  • macro-task包括:script(整體代碼), setTimeout, setInterval, setImmediate, I/O, UI rendering。
  • micro-task包括:process.nextTick, Promises, Object.observe, MutationObserver

執行順序:函數調用棧清空只剩全局執行上下文,然后開始執行所有的micro-task。當所有可執行的micro-task執行完畢之后。循環再次執行macro-task中的一個任務隊列,執行完之后再執行所有的micro-task,就這樣一直循環。

  1. (function test() {  
  2.     setTimeout(function() {console.log(4)}, 0);  
  3.     new Promise(function executor(resolve) {  
  4.         console.log(1);  
  5.         for( var i=0 ; i<10000 ; i++ ) {  
  6.             i == 9999 && resolve();  
  7.         }  
  8.         console.log(2);  
  9.     }).then(function() {  
  10.         console.log(5);  
  11.     });  
  12.     console.log(3);})() 

執行過程:

1. 遇到setTimeout,交給其他模塊執行,執行完后回調放入macro-task中

2. 遇到Promise,立即執行里面的function,輸出1。

3. 循環開始,遇到resolve(),修改Promise狀態為fulfill。繼續執行,輸出2。

4. 遇到then,將回調放入micro-task中。

5. 繼續執行,輸出3。

6. call stack執行完畢了。開始執行micro-task中的回調函數,輸出5。

7. micro-task執行完畢,開始執行macro-task中的回調函數,輸出4。

8. 結束。

【本文為51CTO專欄作者“謝軍”的原創稿件,轉載可通過作者微信公眾號(jingfeng18)獲取聯系】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2023-04-28 15:20:37

JavaScript事件循環

2021-07-24 11:15:19

開發技能代碼

2021-01-18 08:24:51

JavaScriptMicrotask微任務

2021-12-24 16:55:44

前端開發JavaScript

2020-12-29 08:21:03

JavaScript微任務宏任務

2021-03-01 23:31:48

隊列實現棧存儲

2017-07-26 13:51:19

前端JavaScriptTypeScript

2017-08-07 18:45:51

前端JavaScript技術棧

2021-06-10 07:51:07

Node.js循環機制

2021-12-08 07:55:41

EventLoop瀏覽器事件

2022-08-11 08:03:43

隊列

2022-06-13 10:24:47

宏任務微任務前端

2021-09-10 15:13:41

鴻蒙HarmonyOS應用

2021-05-27 09:00:00

Node.js開發線程

2024-01-05 08:49:15

Node.js異步編程

2017-08-16 10:36:10

JavaScriptNode.js事件驅動

2013-05-21 09:54:39

Web前端

2021-09-06 13:12:05

前端JavaScript編程

2015-11-12 10:03:34

前端H5web

2021-12-18 07:42:15

Ebpf 監控 Node.js
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本三级电影免费 | 国产黄色在线 | 一区二区三区在线免费观看视频 | 日本在线免费看最新的电影 | 在线观看av免费 | 国产在线精品一区二区 | 蜜桃一区二区三区 | 久久综合伊人 | 亚洲男人网 | 成av人电影在线 | 亚洲视频免费一区 | 国产欧美精品一区二区三区 | 久久精品国产一区二区三区不卡 | 毛片网络| 久久久久久女 | 成人高潮片免费视频欧美 | 成人精品鲁一区一区二区 | 日韩精品视频在线观看一区二区三区 | 蜜臀久久99精品久久久久久宅男 | 激情五月激情综合网 | 成人福利片 | 成人在线免费观看 | 日韩在线一区二区三区 | 亚洲大片在线观看 | www.干| 国产成人精品久久二区二区91 | 超碰成人免费观看 | 色婷婷九月 | 91xxx在线观看 | 亚洲欧美中文日韩在线v日本 | 久99久视频| 亚洲网视频| 91社影院在线观看 | 亚洲国产成人av好男人在线观看 | 69精品久久久久久 | 国产成人精品免高潮在线观看 | 国产精品视频久久久久久 | 国产精品久久久久久久岛一牛影视 | 在线视频三区 | 亚洲不卡av在线 | 毛片一区二区三区 |