五分钟系列:调用栈

83 阅读2分钟

之前在 变量提升一文里,说到了执行上下文。这里我们要学习的是,调用栈。

我们首先需要明确两件事情:

  • 函数执行都会有自己的执行上下文
  • 函数需要执行时才会编译出它的执行上下文

调用栈是什么

在执行上下文创建好后,JavaScript引擎会将执行上下文压入栈中,通常把这种用来管理执行上下文的栈称为执行上下文栈,又称调用栈

简单例子

var a = 1
function add(b,c){
  return b+c
}
function addAll(b,c){
  var d = 5
  result = add(b,c)
  return  a+result+d
}
addAll(3,6)
  1. 创建全局上下文,并将其压入栈底 image.png
  2. 开始执行代码,进行a=1的操作 image.png
  3. 接着调用addAll函数,此时先编译该函数。此时JavaScript引擎会编译该函数创建执行上下文,然后压入栈中 image.png
  4. 执行addAll(3,6),其中的d变为5,然后需要调用add函数
  5. 编译add函数,为其创建执行上下文并压入栈中 image.png
  6. 执行完add函数,该函数的执行上下文就会从栈顶弹出,并将result的值设置为add函数的返回值,也就是9 image.png
  7. addAll执行最后一个相加操作后并返回,addAll的执行上下文也会从栈顶部弹出,此时调用栈中就只剩下全局上下文了。 image.png

总结

  • 每调用一个函数,JavaScript引擎会为其创建执行上下文,并把该执行上下文压入调用栈,然后JavaScript引擎开始执行函数代码。
  • 如果在一个函数A中调用了另外一个函数B,那么JavaScript引擎会为B函数创建执行上下文,并将B函数的执行上下文压入栈顶。
  • 当前函数执行完毕后,JavaScript引擎会将该函数的执行上下文弹出栈。
  • 当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。