之前在 变量提升一文里,说到了执行上下文。这里我们要学习的是,调用栈。
我们首先需要明确两件事情:
- 函数执行都会有自己的执行上下文
- 函数需要执行时才会编译出它的执行上下文
调用栈是什么
在执行上下文创建好后,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)
- 创建全局上下文,并将其压入栈底
- 开始执行代码,进行
a=1的操作 - 接着调用
addAll函数,此时先编译该函数。此时JavaScript引擎会编译该函数创建执行上下文,然后压入栈中 - 执行
addAll(3,6),其中的d变为5,然后需要调用add函数 - 编译
add函数,为其创建执行上下文并压入栈中 - 执行完add函数,该函数的执行上下文就会从栈顶弹出,并将result的值设置为add函数的返回值,也就是9
- addAll执行最后一个相加操作后并返回,addAll的执行上下文也会从栈顶部弹出,此时调用栈中就只剩下全局上下文了。
总结
- 每调用一个函数,JavaScript引擎会为其创建执行上下文,并把该执行上下文压入调用栈,然后JavaScript引擎开始执行函数代码。
- 如果在一个函数A中调用了另外一个函数B,那么JavaScript引擎会为B函数创建执行上下文,并将B函数的执行上下文压入栈顶。
- 当前函数执行完毕后,JavaScript引擎会将该函数的执行上下文弹出栈。
- 当分配的调用栈空间被占满时,会引发“堆栈溢出”问题。