成人免费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-02-09 11:02:16

JavaScript前端框架

2022-12-12 08:42:06

Java對象棧內存

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

2010-07-30 12:56:02

Flex調用JavaS

2024-03-04 08:45:30

JavaScript深度拷貝對象

2020-08-10 14:46:30

JavaScriptStack

2017-04-06 10:27:01

JavaScript基礎Java

2021-10-22 08:29:14

JavaScript事件循環

2009-07-20 17:59:07

JavaScript調ASP.NET AJA
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜夜爽99久久国产综合精品女不卡 | 天天操天天拍 | 在线看成人av | 亚洲欧美一区二区三区1000 | 二区三区视频 | 伊人最新网址 | 嫩呦国产一区二区三区av | 亚洲精品在线观看视频 | 欧美日韩中文在线 | 国产视频亚洲视频 | 日韩中文字幕网 | 国产伦精品一区二区三区精品视频 | 亚洲精选一区二区 | 色综合一区二区三区 | 午夜影院在线观看 | av毛片免费| 精品一区二区三区免费毛片 | 精品国产乱码久久久久久影片 | 亚洲人成人一区二区在线观看 | 久久精品中文 | 亚洲免费在线 | 色五月激情五月 | 国产色婷婷精品综合在线播放 | 免费在线观看一区二区 | 日韩一二三区视频 | 国产乱码精品一区二区三区中文 | 欧美三级在线 | 国产一区二区免费 | 国产一区二区在线播放 | 日韩av一区二区在线观看 | 一区二区精品 | 欧美激情一区二区三区 | 精品国产一区久久 | 免费视频久久久久 | 国产午夜亚洲精品不卡 | 国产一级在线视频 | 亚洲视频中文字幕 | 国内自拍偷拍视频 | 妖精视频一区二区三区 | 日本三级网址 | 伊人久久一区二区 |