天天看點

JavaScript執行堆棧

我們首先看JavaScript的函數底層工作原理

一個函數運作的資訊被存儲在它的執行上下文裡。

執行上下文是一個内部資料結構,它包含一個函數執行時的細節:目前工作流在哪裡,目前的變量,this的值(這裡我們不使用它),以及其他一些内部細節。

每個函數有嵌套調用時,下面的事情會發生:

  • 目前函數被暫停;
  • 與它關聯的執行上下文被一個叫做執行上下文堆棧的特殊資料結構儲存;
  • 執行嵌套調用;
  • 嵌套調用結束後,之前的執行上下文從堆棧中恢複,外部函數從停止的地方繼續執行。

    我們看看調用pow(2, 3)都發生了什麼。

    pow(2, 3)

    在調用pow(2, 3)的開始,執行上下文會存儲變量:x = 2, n = 3,執行流程在函數的第1行。

    我們将其描繪如下:

    JavaScript執行堆棧
    這是函數開始執行的時候,條件 n == 1結果為否,是以流程進入if的第二分支。
function pow(x, n) {
	if (n == 1) {
		return x;
	} else {
		return x * pow(x, n - 1);
	}
}
alert(pow(2, 3));
           
function pow(x, n) {
	if (n == 1) {
		return x;
	} else {
		return x * pow(x, n - 1);
	}
}
           
function pow(x, n) {
	let result = 1;
	for (let i = 0; i < n; i++) {
		result *= x;
	}
	return result;
}