【问题标题】:Behavior of Global Execution Context wrt setTimeout全局执行上下文 wrt setTimeout 的行为
【发布时间】:2023-02-06 00:45:45
【问题描述】:

假设我有以下代码

function perpetuity() {
  console.log("Being called");
  setTimeout(perpetuity, 1500);
}

perpetuity();

我想知道调用堆栈中是否存在全局执行上下文,以便可以执行此代码。 或者 如果全局执行上下文随着回调函数的执行上下文每 1500ms 一起创建和删除。

Chat gpt 说 GEC 永远不会停止,但执行此操作时我无法在浏览器的调用堆栈中找到 GEC。

【问题讨论】:

  • 当然,全局上下文仍然存在——毕竟,当它正在运行时,您可以与例如window 在浏览器的控制台中..?
  • 我的问题是它是保留在调用堆栈中还是每 1500 毫秒添加和删除一次。另外,如果它仍然存在,为什么我不能在浏览器的调用堆栈中看到它
  • 无论什么遗迹?另外,它会有什么不同,即你为什么需要知道这个? (此外,这听起来很深奥,不同的浏览器可以做不同的事情。)
  • GEC 保留与否。我正在学习 JS,这就是为什么我需要知道这个
  • 那么,您认为console.logsetTimeout 来自哪里?如果您运行该代码,然后在您的控制台中输入 setTimeout = null; 会怎么样?你认为会发生什么?

标签: javascript executioncontext


【解决方案1】:

没有“全局执行上下文”。 (我假设您不会将此与 global environment record 混淆?)

然而,在浏览器中运行的所有 js 代码都有一个 realm execution context。它实际上对任何事情都没有用,更多的是技术性的(允许跟踪导致执行的领域),但在运行任何 JS 代码之前它是 pushed to the execution context stackpopped afterwards。它是在InitializeHostDefinedRealm中与领域的内在函数、全局对象和全局环境一起创建到create the realm

【讨论】:

    最近更新 更多