需要澄清关于执行上下文的问题。

3
function a(){
    b();
    var c;
}

function b(){
    var d;
}

a();
var d;

我希望对上述代码的执行上下文做出澄清。据我理解,在执行上下文函数 ab 的创建阶段期间,它们被设置为指向堆内存中的位置的指针,而 var d 则被设置为 undefined。在执行阶段期间,函数声明 ab 将被简单地忽略。
令我困惑的是,在执行阶段调用函数 a 时,全局执行上下文是否仍处于执行阶段,以便稍后从堆栈中弹出 a() 的执行上下文,以处理 var d?还是说一旦我们调用 a(),全局执行上下文的执行阶段就结束了,然后我们在只剩下全局执行上下文的情况下扫描 var d
据我所知,在 GEC 执行阶段之后,将调用 a() 并将新的 a() 执行上下文 放入执行堆栈中。然后在 a() 的执行阶段完成后,我们将新的 b() 执行上下文 放入堆栈中。在我们弹出 b() 的执行上下文后,我们可以处理 var c,然后在弹出 a() 的执行栈 后,我们可以处理全局执行堆栈中的 var d
最大的困惑是 JS 引擎如何检查 var cvar b,如果两个上下文的执行阶段已经结束。执行上下文是否真正结束了,还是每个上下文仍在运行执行阶段?我们能够扫描 var cvar d,是由于变量对象(VO)保存有关当前执行上下文的信息,还是由于所有先前的执行上下文仍在运行执行阶段?

1
“在GEC执行阶段之后,将调用a()” - 为什么是“之后”? a()在全局代码执行期间被调用。 - Bergi
1
你的问题有点不清晰,因为“执行阶段”不是一个标准术语。你对“阶段”有什么具体理解?当“阶段结束”时,这对你意味着什么? - Bergi
在GEC执行阶段之后,将调用a()。我写错了。我的问题是特定执行上下文的执行阶段何时结束。对我来说,阶段是执行上下文的组成部分。有两个阶段,编译/创建阶段和执行阶段。我不知道执行阶段是否是一个标准术语,但从我看到的文章和视频数组中,它们都引用它为这样。在执行阶段期间,将调用函数并分配值。 - Roma Kim
在 https://ui.dev/ JavaScript 可视化工具中运行我的代码后,我得到了答案 :) 但如果有人能提供更详细的解释,我仍然会非常感激。提前感谢所有的帮助。 - Roma Kim
1
“执行阶段”不是标准术语。但是如果您认为这两个阶段是用于 “制作” 执行上下文的,那么第二阶段需要持续与执行上下文本身一样长。并且在函数调用期间,它被保存在执行上下文的堆栈(即“调用堆栈”)中,以便在被调用的函数返回时恢复其执行。 - Bergi
显示剩余2条评论
1个回答

1
因此,在js中,调用堆栈按照LIFO的方式工作,考虑您的示例,执行上下文将按以下方式执行:
1. 初始
[gec]
2. 调用a()
[a执行上下文]
[gec]
3. 调用b()
[b执行上下文]
[a执行上下文]
[gec]
4. b() 执行完毕
[a执行上下文]
[gec]
5. a() 执行完毕
[gec]
希望这可以帮助您!

谢谢你的回答!我花了一些时间才理解你尝试绘制的堆栈,但我明白了。我想这帮助我意识到了我正在寻找的答案。我仍然不真正理解变量c和变量d何时被处理,我猜想是在第4和第5个执行步骤期间? - Roma Kim
是的,你说得对,它在第4步和第5步期间被处理。 - Raj Chudasama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接