JavaScript教程-JavaScript調用堆棧

2024年2月6日 16点热度 0人点赞

為了管理執行上下文,JavaScript引擎使用調用堆棧。JS調用堆棧的工作是在內部執行的,但我們將在這裡了解它的工作原理。

在這個部分,我們將討論JavaScript調用堆棧及其工作原理。我們還將討論一個示例,以便更好地理解這個概念。

什麼是JS調用堆棧

JavaScript執行上下文(全局執行上下文和函數執行上下文)是通過JavaScript引擎執行的。為了管理這些執行上下文,JS引擎使用調用堆棧。因此,JS調用堆棧是一種數據結構,用於跟蹤被調用和執行的函數信息。因此,如果用戶調用一個函數進行執行,指定的函數就會被推送/添加到調用堆棧中,當用戶從函數返回時,表示該函數已從調用堆棧中彈出。因此,調用堆棧是一個遵循後進先出(LIFO)原則的普通棧數據結構。

JavaScript調用堆棧的作用

JS引擎使用調用堆棧的地方有:

  • 當用戶執行任何腳本時,JS引擎會創建一個全局執行上下文,然後將其添加到調用堆棧的頂部,以便執行全局代碼。
  • 當用戶調用一個函數時,JS引擎會創建該函數的執行上下文,並將其添加到堆棧的頂部,以便執行該函數。
  • 如果一個函數內部調用另一個函數,JS引擎會為被調用函數創建執行上下文,並將其添加到堆棧的頂部,然後開始執行。
  • 當一個函數執行完成時,它會從堆棧中彈出,並繼續執行堆棧中的其他函數。
  • 如果堆棧中沒有空間,並且我們嘗試推送更多的函數,就會拋出“堆棧溢出”錯誤,如果在調用堆棧中沒有更多執行上下文,就會拋出“堆棧下溢”錯誤。

JavaScript調用堆棧示例

讓我們看一個示例,以了解JavaScript調用堆棧函數的使用方法:

function getSum(x, y) { 
  return x   y; 
} 
function findavg(x, y) { 
  return getSum(x, y) / 2; 
} 
let z = findavg(10, 20);

在上面的代碼中,當執行腳本時,首先創建了全局執行上下文,並將其推送到調用堆棧的頂部。然後,調用了findavg(10, 20)函數,引擎創建了findavg()函數的執行上下文,並將其推送到堆棧的頂部。接著,調用了getSum()函數,引擎創建了getSum()函數的執行上下文,並將其推送到堆棧的頂部。函數執行完成後,它們會被依次彈出,直到堆棧為空。

堆棧溢出會在堆棧空間不足時發生,或者在遞歸函數沒有適當的終止條件時發生。JavaScript調用堆棧的大小由宿主環境(例如Node.js或Web瀏覽器)的實現決定。當堆棧的大小限制被超過時,就會發生堆棧溢出,引發“堆棧溢出”錯誤。JavaScript是一種同步且單線程的編程語言,意味著它會按順序執行代碼,一次隻能執行一個操作。