偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊JavaScript中調(diào)用棧

開發(fā) 前端
javascript是一門單線程語言,主線程在同一時間只能處理一件事。那Javascript是如何處理處理函數(shù)的調(diào)用關(guān)系的?

1:基本概念

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

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

隊列:是一種先進(jìn)先出的線性數(shù)據(jù)結(jié)構(gòu)。

函數(shù)的調(diào)用的進(jìn)棧和出棧的順序,遵循 先進(jìn)后出 的原則。

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

​ 棧:一般由操作系統(tǒng)自動分配釋放。

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

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

操作數(shù)據(jù):堆棧(先進(jìn)后出),隊列(先進(jìn)先出)。

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

調(diào)用棧是解析器的一種機制。

javascript是一門單線程語言,主線程在同一時間只能處理一件事。那javascript是如何處理處理函數(shù)的調(diào)用關(guān)系的?

答案是——調(diào)用棧。

2:Event Loop(事件循環(huán))

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

 

JavaScript中調(diào)用棧

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

js既然是單線程那么肯定是排隊執(zhí)行代碼,怎么去排這個隊就是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:宏任務(wù)(Mask-task)

  • setTimeout
  • setInterval
  • I/O

特點:由JavaScript線程外的宿主線程執(zhí)行,比如,定時器觸發(fā)線程setTimeout、setInterval,異步http請求線程。JavaScript線程不空閑宏任務(wù)永遠(yuǎn)沒有執(zhí)行機會。

  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:微任務(wù)(Mask-task)

  • promise

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

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-02-09 11:02:16

JavaScript前端框架

2022-12-12 08:42:06

Java對象棧內(nèi)存

2021-10-17 22:40:51

JavaScript開發(fā) 框架

2021-01-07 07:53:10

JavaScript內(nèi)存管理

2021-12-02 09:13:56

序列壓入

2021-06-02 09:01:19

JavaScript 前端異步編程

2017-03-13 10:35:10

JavaScript錯誤調(diào)用棧

2013-12-09 09:42:50

JavaScript全棧式

2023-12-28 09:55:08

隊列數(shù)據(jù)結(jié)構(gòu)存儲

2020-11-26 18:18:21

微服務(wù)業(yè)務(wù)規(guī)模技術(shù)

2020-12-18 09:05:13

算法單調(diào)棧

2021-09-08 08:55:45

Javascript 高階函數(shù)前端

2022-02-23 09:03:29

JavaScript開發(fā)命名約定

2021-09-06 08:26:08

JavaScript數(shù)獨 LeetCode

2010-07-30 12:56:02

Flex調(diào)用JavaS

2024-03-04 08:45:30

JavaScript深度拷貝對象

2020-08-10 14:46:30

JavaScriptStack

2017-04-06 10:27:01

JavaScript基礎(chǔ)Java

2021-10-22 08:29:14

JavaScript事件循環(huán)

2009-07-20 17:59:07

JavaScript調(diào)ASP.NET AJA
點贊
收藏

51CTO技術(shù)棧公眾號