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)
我们进行分析上面代码在栈是时候是如何进行执行的
- 从图中你也可以看出,变量a、函数add和addAll都保存到了全局上下文的变量环境对象中。全局执行上下文压入到调用栈后,JavaScript引擎便开始执行全局代码了
- 执行到 a 然后赋值a = 2, 开始执行 addAll 代码 创建addALL上下文 压入栈中,然后在进行执行 d = 10 ,执行到result 的时候 开始执行 add 函数 并创建上下文 压入调用栈中 并执行内部代码 返回9 把add的调用栈从栈中弹出,然后开始执行 allAll 调用栈并得出结果返回,并弹出栈, 这个时候栈全部结束 代码执行完成。
每调用一个函数,JavaScript引擎会为其创建执行上下文,并把该执行上下文压入调用栈,然后JavaScript引擎开始执行函数代码。
如果在一个函数A中调用了另外一个函数B,那么JavaScript引擎会为B函数创建执行上下文,并将B函数的执行上下文压入栈顶。
当前函数执行完毕后,JavaScript引擎会将该函数的执行上下文弹出栈。
当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。
栈是一种非常重要的数据结构,不光应用在JavaScript语言中,其他的编程语言,如C/C++、Java、Python等语言,在执行过程中也都使用了栈来管理函数之间的调用关系。所以栈是非常基础且重要的知识点,你必须得掌握。
为什么JavaScript代码会出现栈溢出
fucntion add (a,b) {
add(a,b)
returen a + b ;
}
add(1,2)
1.上面代码的代码为什么会栈溢出, 是因为他是递归调用这个函数,他一直执行这个函数,然后他一直把函数压入栈中,栈是有最大值的,如果超出了栈最大值,就会出现栈溢出的问题。