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

聊聊JavaScript中調用棧

開發 前端
javascript是一門單線程語言,主線程在同一時間只能處理一件事。那Javascript是如何處理處理函數的調用關系的?

1:基本概念

棧(stack):用來保存簡單的數據字段。

堆(heap):用來保存棧中簡單的數據字段對指針的引用。

隊列:是一種先進先出的線性數據結構。

函數的調用的進棧和出棧的順序,遵循 先進后出 的原則。

空間分配: 堆:一般由程序員釋放,如果程序員不釋放就會在結束時由OS回收;

​ 棧:一般由操作系統自動分配釋放。

緩存方式: 堆:存放在二級緩存中,生命周期一般是由虛擬機的垃圾回收算法決定的;

​ 棧:存放在一級緩存中,被調用時處于存儲空間,調用完立即釋放。

操作數據:堆棧(先進后出),隊列(先進先出)。

調用棧是一種棧結構,它用來存儲計算機程序執行時候其活躍子程序的信息。它是一種LIFO的數據結構,將記錄代碼運行時的執行上下文。當遇到某個函數的調用語句時,它將會記錄當前的執行上下文,將函數入棧,并為其創建一個新的執行上下文。(比如什么函數正在執行,什么函數正在被這個函數調用等等信息)。

調用棧是解析器的一種機制。

javascript是一門單線程語言,主線程在同一時間只能處理一件事。那javascript是如何處理處理函數的調用關系的?

答案是——調用棧。

2:Event Loop(事件循環)

JavaScript是一個單線程,它執行的所有代碼都放在下面這個Call Stack里面,當Call Stack執行完畢之后,就會再右側的隊列里面找任務,如果有微任務,就會先執行微任務,再去執行宏任務。

 

JavaScript中調用棧

事件循環:就是同步任務進入主線程,異步任務加入到任務隊列中。等主線程的任務執行完就去執行任務隊列中的任務,這個過程會不斷重復。所有同步任務都在主線程上執行,形成一個執行棧。主線程之外, 存在一個任務隊列(task queue), 異步任務有了運行結果會在任務隊列之中放置一個任務。執行棧中的所有同步任務執行完畢后讀取任務隊列(先讀取微任務、宏任務)不斷重復上面的第三步。

js既然是單線程那么肯定是排隊執行代碼,怎么去排這個隊就是Event Loop,雖然js是單線程但是瀏覽器不是單線程。

  1. console.log('script start'); 
  2. ​ 
  3. setTimeout(function() { 
  4.  console.log('timeout1'); 
  5. }, 10); 
  6. ​ 
  7. new Promise(resolve => { 
  8.  console.log('promise1'); 
  9.  resolve(); 
  10.  setTimeout(() => console.log('timeout2'), 10); 
  11. }).then(function() { 
  12.  console.log('then1'
  13. }) 
  14. ​ 
  15. console.log('script end'); 
  16. ​ 
  17. // 
  18. * script start 
  19. * promise1 
  20. * script end 
  21. * then1 
  22. * timeout1 
  23. * timeout2 

3:宏任務(Mask-task)

  • setTimeout
  • setInterval
  • I/O

特點:由JavaScript線程外的宿主線程執行,比如,定時器觸發線程setTimeout、setInterval,異步http請求線程。JavaScript線程不空閑宏任務永遠沒有執行機會。

  1. for(let i=0; i<100000000; i++) {} 
  2. ​ 
  3. setTimeout(function() { 
  4.  console.log('setTimeout1'); 
  5. }, 1000); 
  6. ​ 
  7. setTimeout(function() { 
  8.  console.log('setTimeout2'); 
  9. }, 2000); 

4:微任務(Mask-task)

  • promise

特點:由JavaScript線程維護,它的執行時機是在主線程所有可執行代碼執行完成后執行,瀏覽器渲染DOM前會全部執行。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-12-12 08:42:06

Java對象棧內存

2022-02-09 11:02:16

JavaScript前端框架

2021-10-17 22:40:51

JavaScript開發 框架

2021-01-07 07:53:10

JavaScript內存管理

2021-12-02 09:13:56

序列壓入

2021-06-02 09:01:19

JavaScript 前端異步編程

2017-03-13 10:35:10

JavaScript錯誤調用棧

2013-12-09 09:42:50

JavaScript全棧式

2023-12-28 09:55:08

隊列數據結構存儲

2020-11-26 18:18:21

微服務業務規模技術

2020-12-18 09:05:13

算法單調棧

2021-09-08 08:55:45

Javascript 高階函數前端

2022-02-23 09:03:29

JavaScript開發命名約定

2021-09-06 08:26:08

JavaScript數獨 LeetCode

2024-03-04 08:45:30

JavaScript深度拷貝對象

2010-07-30 12:56:02

Flex調用JavaS

2020-08-10 14:46:30

JavaScriptStack

2017-04-06 10:27:01

JavaScript基礎Java

2024-05-31 08:45:24

2021-10-22 08:29:14

JavaScript事件循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女黄视频网站 | 亚洲精品一区中文字幕乱码 | av中文字幕在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品美女久久久久久久久久久 | 婷婷去俺也去 | 国产精品日产欧美久久久久 | 免费不卡av| 日日草夜夜草 | 欧美簧片 | 黄色三级毛片 | 欧美日韩在线不卡 | 国产乱人伦 | 91国内精品 | 精品91久久 | 精品久久一区二区三区 | 综合久久综合久久 | 欧美午夜精品 | 日本欧美国产在线观看 | 亚洲精品久久久久久宅男 | 国产精品一区二区不卡 | jlzzjlzz欧美大全 | 玖玖爱365| 中文字幕日韩一区二区 | 国产亚洲日本精品 | 精品国产欧美一区二区三区不卡 | 国产精品免费一区二区三区四区 | 91视频a| www精品| 综合亚洲视频 | 日韩免费在线 | 中文字幕国产精品 | 久久久久久国产精品免费免费狐狸 | 久久精品国产亚洲夜色av网站 | 久久免费精品 | 又黑又粗又长的欧美一区 | 精品国产乱码久久久久久蜜退臀 | 五月婷婷视频 | 国外成人在线视频网站 | 午夜在线免费观看 | 一区二区三区四区在线播放 |