跳转至

为什么JavaScript代码会出现栈溢出

创建执行上下文的三种情况:

  1. 当JS执行全局代码的时候,会编译全局代码并创建全局执行上下文,并且在整个页面的生存周期内,全局执行上下文只有一份
  2. 当调用一个函数的时候,函数体内的代码会被编译,并创建函数执行上下文,一般情况下,函数执行结束之后,创建的函数执行上下文会被销毁
  3. 当使用eval函数的时候,eval的代码也会被编译,并创建执行上下文

调用栈

调用栈:调用栈是一个后进先出的数据结构,用于跟踪函数的调用

帧:帧是每次函数调用时在调用栈中创建的一个数据结构,它用于保存函数的执行上下文,包括:

  • 函数的参数
  • 函数的局部变量
  • 返回地址
  • 函数的上下文信息

调用栈和帧的工作原理

function func1(){
    func2()
}
function func2(){
    func3()
}
function func3(){
    console.log("Nihao")
}
func1()

每次函数调用都会向调用栈中添加一个帧,这个帧用于保存当前函数的执行状态

函数执行完毕后,帧会被从调用栈中移除,并返回到上一个函数的调用位置继续调用

设想一个场景,当陷入了一个死循环,比如一个递归函数无休止的调用本身时,每次调用JavaScript 引擎都会为其创建一个新的执行上下文,并将执行上下文压入调用栈中,超过栈的内存大小时,就会导致栈溢出