Javascript执行上下文顺序

Javascript执行上下文顺序,javascript,executioncontext,Javascript,Executioncontext,首先,我调用func1,因此它位于全局执行上下文之上。然后它调用func2。我想知道的是,在调用func2之后,func1是立即返回还是退出执行堆栈?还是说,首先func2位于func1执行上下文之上,它返回,然后func1返回,最后我们回到全局执行上下文 func1(); 函数func1(){ func2(); } 函数func2(){ 常数x=2; }函数调用作为堆栈实现。调用func1时,它会立即调用func2。当func2返回时,它将返回到func1的范围并从那里继续。浏览器优化可能会

首先,我调用func1,因此它位于全局执行上下文之上。然后它调用func2。我想知道的是,在调用func2之后,func1是立即返回还是退出执行堆栈?还是说,首先func2位于func1执行上下文之上,它返回,然后func1返回,最后我们回到全局执行上下文

func1();
函数func1(){
func2();
}
函数func2(){
常数x=2;

}
函数调用作为堆栈实现。调用
func1
时,它会立即调用
func2
。当
func2
返回时,它将返回到
func1
的范围并从那里继续。浏览器优化可能会意识到在
func2()
之后没有更多的指令,并跳过该链,但这取决于实现。

在您的示例中,
func1
可能会在调用
func2()
后立即返回,因为没有其他代码要运行,但通常情况并非如此。考虑

function func1() {
    const message = "example";
    func2();
    console.log(message);
}
然后,在弹出
func2()
的执行上下文后(从那里返回时),日志仍将在执行
func1
时运行


执行上下文在堆栈中管理,一次只能推送和弹出一个。弹出堆栈帧时,它将在推送堆栈帧时停止的位置继续执行。

它的工作方式类似于堆栈,但有一种称为。另外,请注意,一旦@peterMader,这不是递归。我认为这是一件优化的事情,我不认为优化这件事真的有好处,所以func2执行上下文被弹出,然后func1执行上下文被弹出?@MagneticKode一般来说,是的。然而,现代JS引擎经过了大量优化,因此解释器可能足够聪明,甚至永远不会回到
func1
。谢谢。这消除了我的困惑。我知道这并不重要,因为如果func2在func1下,由于作用域链,func2仍然可以访问func1变量,即使func1不再在执行堆栈上。说到理论,我想说得非常清楚。@MagneticKode func2仍然可以访问func1变量-这不是真的。
func2
无法访问
func1
的范围。在这种情况下,是。我是说如果func2在func1里面。