JavaScript 使用调用堆栈(call stack)来跟踪多个函数调用。它就像数据结构中的一个真正的堆栈,可以在其中压入和弹出数据,并遵循 后进先出 (LIFO)原则。我们使用调用堆栈来记住当前正在运行的函数。
示例:下面的示例演示了调用堆栈。
function f1() {
console.log("Hi, f1!");
}
function f2() {
f1();
console.log("Hi, f2!");
}
f2();
输出
"Hi by f1!"
"Hi by f2!"
下面的步骤和插图解释了这个过程
步骤一: 当代码加载到内存中时,全局执行上下文被压入堆栈。
步骤二: f2() 函数被调用,f2() 的执行上下文被压入堆栈
步骤三: f2() 的在执行期间,由于f1() 函数在 f2() 函数内部被调用。因此 f1() 的执行上下文被推入调用堆栈。
步骤四: 现在 f1() 函数开始执行。 console.log() 方法的新栈帧将被压入堆栈。
步骤五: 当 console.log() 方法运行时,它将打印“Hi by f1”,然后从堆栈中弹出。执行上下文将返回到函数,现在 f1() 函数中已没有代码行,因此将从调用堆栈中弹出
步骤六:这同样会发生在f2函数的console.log() 方法中,该方法打印“Hi by f2”行,然后函数 f2() 最终完成并将被弹出堆栈