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