Javascript的调用堆栈

319 阅读1分钟

JavaScript 使用调用堆栈(call stack)来跟踪多个函数调用。它就像数据结构中的一个真正的堆栈,可以在其中压入和弹出数据,并遵循 后进先出 (LIFO)原则。我们使用调用堆栈来记住当前正在运行的函数。

示例:下面的示例演示了调用堆栈。

function f1() {
    console.log("Hi, f1!");
}
function f2() {
    f1();
    console.log("Hi, f2!");
}
f2();

输出


"Hi by f1!"
"Hi by f2!"

下面的步骤和插图解释了这个过程

步骤一: 当代码加载到内存中时,全局执行上下文被压入堆栈。

image.png

步骤二: f2() 函数被调用,f2() 的执行上下文被压入堆栈

image.png

步骤三: f2() 的在执行期间,由于f1() 函数在 f2() 函数内部被调用。因此 f1() 的执行上下文被推入调用堆栈。

image.png

步骤四: 现在 f1() 函数开始执行。 console.log() 方法的新栈帧将被压入堆栈。

image.png

步骤五: 当 console.log() 方法运行时,它将打印“Hi by f1”,然后从堆栈中弹出。执行上下文将返回到函数,现在 f1() 函数中已没有代码行,因此将从调用堆栈中弹出

步骤六:这同样会发生在f2函数的console.log() 方法中,该方法打印“Hi by f2”行,然后函数 f2() 最终完成并将被弹出堆栈