在 JavaScript 中,经常会出现一个函数中调用另外一个函数的情况,这就意味着会存在多个执行上下文。JavaScript 引擎则是通过调用栈来管理多个执行上下文的。
下面将通过一个简单的例子来理解调用栈:
- 在执行全局代码之前,JavaScript 引擎会对全局代码进行编译,创建全局执行上下文,并将全局上下文压入调用栈栈底。
- 全局执行上下文准备好之后,便开始执行全局代码。
- 当执行到
add
函数的时候,则会对add
函数的代码进行编译并创建该函数的执行上下文。然后将上下文压入调用栈中。 - 执行
add
函数的可执行代码,并返回结果。该函数的执行上下文从栈顶弹出。 - 整个 JavaScript 执行流程结束。
现在应该指导调用栈是 JavaScript 引擎追踪函数执行的一个机制,当有多个函数被调用时,通过调用栈就能够追踪到哪个函数正在被执行以及各函数之间的调用关系。
栈溢出
调用栈是有大小的,当入栈的执行上下文超过一定数量,JavaScript 引擎就会报错,这种错误较栈溢出。在写递归代码的时候,就很容易出现栈溢出的情况。