步驟:當(dāng)腳本調(diào)用函數(shù)時(shí)倾哺,解釋器將其添加到調(diào)用堆棧,然后開始執(zhí)行該函數(shù)刽脖。
當(dāng)函數(shù)調(diào)用的任何函數(shù)都會(huì)進(jìn)一步添加到調(diào)用堆棧中羞海,并在其調(diào)用的位置運(yùn)行。
當(dāng)前函數(shù)執(zhí)行完之后曲管,解釋器將其從堆棧中取出并從最后一個(gè)代碼清單中從中斷處繼續(xù)執(zhí)行却邓。
如果堆棧占用的空間超過了分配給他的空間,出現(xiàn)堆棧溢出的錯(cuò)誤院水。
example:
functiongreeting(){
// [1] Some codes
?heresayHi();
// [2] Some codes here
}
function sayHi()
{return"Hi!";}
// Invoke the `greeting`?
function greeting();
// [3] Some codes here
上面的代碼將執(zhí)行如下:
忽略所有函數(shù)腊徙,直到它到達(dá)greeting()?函數(shù)調(diào)用简十。
將`greeting`函數(shù)添加到調(diào)用堆棧列表中。
執(zhí)行`greeting`函數(shù)中的所有代碼行撬腾。
進(jìn)入sayHi()函數(shù)調(diào)用勺远。
將該sayHi()函數(shù)添加到調(diào)用堆棧列表中。
執(zhí)行sayHi()函數(shù)內(nèi)的所有代碼行时鸵,直到結(jié)束胶逢。
將執(zhí)行返回到調(diào)用的行sayHi()并繼續(xù)執(zhí)行g(shù)reeting()函數(shù)的其余部分。
sayHi()從我們的調(diào)用堆棧列表中刪除該函數(shù)饰潜。
當(dāng)greeting()函數(shù)內(nèi)部的所有內(nèi)容都被執(zhí)行后初坠,返回其調(diào)用行繼續(xù)執(zhí)行其余的JS代碼。
greeting()從調(diào)用堆棧列表中刪除該函數(shù)彭雾。
我們從一個(gè)空的調(diào)用堆棧開始碟刺,每當(dāng)我們調(diào)用一個(gè)函數(shù)時(shí),它會(huì)自動(dòng)添加到調(diào)用堆棧中薯酝,在執(zhí)行所有代碼后半沽,它會(huì)自動(dòng)從調(diào)用堆棧中刪除。最后吴菠,我們最終得到了一個(gè)空堆棧者填。