自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

1:基本概念

棧(stack):用來(lái)保存簡(jiǎn)單的數(shù)據(jù)字段。

堆(heap):用來(lái)保存棧中簡(jiǎn)單的數(shù)據(jù)字段對(duì)指針的引用。

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

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

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

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

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

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

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

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

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

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

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

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

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

 

JavaScript中調(diào)用棧

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

js既然是單線程那么肯定是排隊(duì)執(zhí)行代碼,怎么去排這個(gè)隊(duì)就是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

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

  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

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

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

2022-12-12 08:42:06

Java對(duì)象棧內(nèi)存

2022-02-09 11:02:16

JavaScript前端框架

2021-01-07 07:53:10

JavaScript內(nèi)存管理

2021-10-17 22:40:51

JavaScript開發(fā) 框架

2017-03-13 10:35:10

JavaScript錯(cuò)誤調(diào)用棧

2021-12-02 09:13:56

序列壓入

2021-06-02 09:01:19

JavaScript 前端異步編程

2013-12-09 09:42:50

JavaScript全棧式

2010-07-30 12:56:02

Flex調(diào)用JavaS

2023-12-28 09:55:08

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

2020-11-26 18:18:21

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

2020-12-18 09:05:13

算法單調(diào)棧

2017-04-06 10:27:01

JavaScript基礎(chǔ)Java

2020-08-10 14:46:30

JavaScriptStack

2024-03-04 08:45:30

JavaScript深度拷貝對(duì)象

2021-09-08 08:55:45

Javascript 高階函數(shù)前端

2021-09-06 08:26:08

JavaScript數(shù)獨(dú) LeetCode

2022-02-23 09:03:29

JavaScript開發(fā)命名約定

2009-07-20 17:59:07

JavaScript調(diào)ASP.NET AJA

2015-06-25 09:49:25

JavaScript隱式調(diào)用
點(diǎn)贊
收藏

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