为什么JavaScript代码会出现栈溢出¶
创建执行上下文的三种情况:
- 当JS执行全局代码的时候,会编译全局代码并创建全局执行上下文,并且在整个页面的生存周期内,全局执行上下文只有一份
- 当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁
- 当使用eval函数的时候,eval的代码也会被编译,并创建执行上下文
调用栈¶
调用栈:调用栈是一个后进先出的数据结构,用于跟踪函数的调用
帧:帧是每次函数调用时在调用栈中创建的一个数据结构,它用于保存函数的执行上下文,包括:
- 函数的参数
- 函数的局部变量
- 返回地址
- 函数的上下文信息
调用栈和帧的工作原理
function func1(){
func2()
}
function func2(){
func3()
}
function func3(){
console.log("Nihao")
}
func1()
每次函数调用都会向调用栈中添加一个帧,这个帧用于保存当前函数的执行状态
函数执行完毕后,帧会被从调用栈中移除,并返回到上一个函数的调用位置继续调用
设想一个场景,当陷入了一个死循环,比如一个递归函数无休止的调用本身时,每次调用JavaScript 引擎都会为其创建一个新的执行上下文,并将执行上下文压入调用栈中,超过栈的内存大小时,就会导致栈溢出