全局执行上下文是否可能从执行堆栈中弹出



当JS代码开始运行时,全局执行上下文被创建,并位于执行堆栈的底部,以"容纳"全局变量对象和'this'。如果在整个JS代码运行之后执行堆栈变空并且没有全局执行上下文,我们如何仍然能够访问全局变量(例如,我正在运行一个带有JS代码的html文件,在它完成后,我仍然能够通过Chrome控制台看到全局变量的值…)或this如何仍然指向全局对象(如果没有任何执行上下文,就不应该有任何'this'!)?

我可以给自己的唯一解释是,全局执行上下文从不离开执行堆栈;它总是在那里,直到我决定关闭浏览器窗口 我说得对不对

此外,在异步回调的情况下,当一个事件从事件队列中出来并进入JS引擎进行运行时,执行堆栈中到底会发生什么?回调的执行上下文是位于这个堆栈的底部,还是全局执行上下文仍然存在?

还有一个类似的主题,初始全局执行上下文是否曾在JavaScript中从调用堆栈中弹出?;然而,它并不能回答我的问题。

感谢

当整个代码运行时,执行堆栈变空。

我们如何仍然能够访问全局变量?

即使没有执行任何代码,具有全局对象的全局词法环境仍然存在。当您将一些代码输入chrome控制台时,将对代码进行评估,创建并初始化一个新的全局执行上下文,其中词法和变量环境设置为全局环境,this绑定到全局对象。然后,您的代码在此上下文中执行,执行堆栈再次变为空。

this如何仍然指向全局对象?

每次使用全局代码初始化新的全局执行上下文时,this都会绑定到全局对象。

在异步回调的情况下,当一个事件从事件队列中出来并进入JS引擎进行运行时,执行堆栈中到底发生了什么?

再次,创建一个新的全局执行上下文,并将其推送到空的执行堆栈上。在MDN中,这与ECMAScript规范中的描述略有不同:

当堆栈为空时,将从队列中取出一条消息并进行处理。处理包括调用相关函数(从而创建初始堆栈帧)。当堆栈再次变为空时,消息处理结束。(MDN。并发模型和事件循环

这里"堆栈帧"表示"执行上下文","初始堆栈帧"对应"全局执行上下文"。

回调的执行上下文是位于这个堆栈的底部,还是全局执行上下文仍然存在?

没有。堆栈为空。只有当它为空时,最旧的回调才会从回调/事件队列中获取:

当没有正在运行的执行上下文并且执行上下文堆栈为空时,ECMAScript实现从作业队列中删除第一个PendingJob,并使用其中包含的信息创建执行上下文,并开始执行关联的作业抽象操作ECMAScript 6.0规范

相关内容

  • 没有找到相关文章

最新更新