当函数 f 调用一个函数 g,g 就需要知道它完成后在哪里返回(在 f 内部)。这里的主要方式是使用栈进行管理,即调用堆栈。来看一个实例。
function h( z ){
console.log(newError.stack );// (A)
}
function g(y){
h(y+1 );// (B)
}
function f(x){
g(x+1 );// (C)
}
f( 3 );// (D)
return;
开始,当上面的程序运行时,调用堆栈为空。 当在 D 处函数调用 f( 3 )时,栈中有了一个项: 当前的全局作用域
当在 C 处调用函数 g( x+1 )时,栈中就有了两个项: 当前的 f 当前的全局作用域
在当 B 处调用函数 h( y+1 )时,栈中含有了三项: 当前的 g 当前的 f 当前的全局作用域
在 A 处的栈跟踪内会展示出下面的调用堆栈:
Error at h at g at f at
接下来,每当一个函数执行结束,栈中就会相应的删除顶部的对应项。当函数 f 结束后,就会回到全局作用域,然后调用栈变为空。在 E 处,返回是栈为空,意味着程序的结束。