var a = 2
function add(b, c) {
console.trace()
return b + c
}
function addAll(b, c) {
var d = 10
result = add(b, c)
return a + result + d
}
addAll(3, 6)
我們進行分析上面代碼在棧是時候是如何進行執(zhí)行的
- 從圖中你也可以看出句柠,變量a秕铛、函數(shù)add和addAll都保存到了全局上下文的變量環(huán)境對象中住涉。全局執(zhí)行上下文壓入到調(diào)用棧后木人,JavaScript引擎便開始執(zhí)行全局代碼了
- 執(zhí)行到 a 然后賦值a = 2信柿, 開始執(zhí)行 addAll 代碼 創(chuàng)建addALL上下文 壓入棧中,然后在進行執(zhí)行 d = 10 醒第,執(zhí)行到result 的時候 開始執(zhí)行 add 函數(shù) 并創(chuàng)建上下文 壓入調(diào)用棧中 并執(zhí)行內(nèi)部代碼 返回9 把add的調(diào)用棧從棧中彈出渔嚷,然后開始執(zhí)行 allAll 調(diào)用棧并得出結(jié)果返回,并彈出棧淘讥, 這個時候棧全部結(jié)束 代碼執(zhí)行完成圃伶。
每調(diào)用一個函數(shù),JavaScript引擎會為其創(chuàng)建執(zhí)行上下文蒲列,并把該執(zhí)行上下文壓入調(diào)用棧窒朋,然后JavaScript引擎開始執(zhí)行函數(shù)代碼。
如果在一個函數(shù)A中調(diào)用了另外一個函數(shù)B蝗岖,那么JavaScript引擎會為B函數(shù)創(chuàng)建執(zhí)行上下文侥猩,并將B函數(shù)的執(zhí)行上下文壓入棧頂。
當前函數(shù)執(zhí)行完畢后抵赢,JavaScript引擎會將該函數(shù)的執(zhí)行上下文彈出棧欺劳。
當分配的調(diào)用棧空間被占滿時铅鲤,會引發(fā)“堆棧溢出”問題划提。
棧是一種非常重要的數(shù)據(jù)結(jié)構(gòu),不光應(yīng)用在JavaScript語言中邢享,其他的編程語言鹏往,如C/C++、Java骇塘、Python等語言伊履,在執(zhí)行過程中也都使用了棧來管理函數(shù)之間的調(diào)用關(guān)系。所以棧是非晨钗ィ基礎(chǔ)且重要的知識點唐瀑,你必須得掌握。
為什么JavaScript代碼會出現(xiàn)棧溢出
fucntion add (a,b) {
add(a,b)
returen a + b ;
}
add(1,2)
1.上面代碼的代碼為什么會棧溢出插爹, 是因為他是遞歸調(diào)用這個函數(shù)哄辣,他一直執(zhí)行這個函數(shù),然后他一直把函數(shù)壓入棧中,棧是有最大值的柔滔,如果超出了棧最大值溢陪,就會出現(xiàn)棧溢出的問題。