相信有過其他語言編程經(jīng)驗(yàn)的讀者都聽說過CallStack的概念丈积。Javascript中的CallStack類似仲智。
CallStack是一個(gè)棧結(jié)構(gòu)辽社,棧的特點(diǎn)是LIFO(后入先出)碉就,出棧入棧只會(huì)在一端(也就是棧頂)進(jìn)行午阵。
CallStack是用來處理函數(shù)調(diào)用與返回的县袱。每次調(diào)用一個(gè)函數(shù)浑娜,Javascript運(yùn)行時(shí)會(huì)生成一個(gè)新的調(diào)用結(jié)構(gòu)壓入CallStack。而函數(shù)調(diào)用結(jié)束返回時(shí)式散,JavaScript運(yùn)行時(shí)會(huì)將棧頂?shù)恼{(diào)用結(jié)構(gòu)彈出筋遭。由于棧的LIFO特性,每次彈出的必然是最新調(diào)用的那個(gè)函數(shù)的結(jié)構(gòu)暴拄。
Javascript啟動(dòng)時(shí)漓滔,從文件或標(biāo)準(zhǔn)輸入加載程序。加載完成時(shí)揍移,Javascript運(yùn)行時(shí)會(huì)生成一個(gè)匿名的函數(shù)次和,函數(shù)體就是輸入的代碼。
瀏覽器自帶的控制臺(tái)調(diào)試
計(jì)算1+2+3+...n的函數(shù)算法
function sum(n) {
if (n == 1) {
return 1
} else {
return n + sum.call(undefined, n - 1)
}
}
sum.call(undefined, 5) // 5 + sum(5)
//sum(4) // 4 + sum(3)
//sum(3) // 3 + sum(2)
//sum(2) // 2 + sum(1)
//sum(1)