首页 > 解决方案 > JS 执行上下文完成后是否会保留在内存中(如果对其中创建的词法环境的引用仍然存在)?

问题描述

还是执行上下文对象被垃圾回收,只留下仍被引用的词法环境对象(即被闭包引用)?

图片

即左侧的执行上下文对象在从堆栈中弹出时是否会被垃圾收集,而如果被闭包引用,[[Environment]] 是否仍然存在?

还想知道:

ExecutionContext a) 创建全局/窗口/模块类型对象并 b) 将其“this”属性的值设置为指向它。(全局和窗口是 ExecutionContext 的属性)。

还是 ExecutionContext == 全局和窗口类型的对象?

标签: javascript

解决方案


一个变量将保留在内存中,直到至少有一个标识符链接到它。如果您在闭包中有一些变量,它们将保留在内存中,直到该闭包处于活动状态。

function foo() {
  const a = 1;
  const b = 2;
  
  return function boo() {
    return a + b;
  }
}

const moo = foo() //moo is now linked to the boo closure

在示例中,所有链接都以这种方式出现:

  1. mooboo相关联
  2. boo链接到它自己的 Lexical Environment 对象
  3. boo 的词法环境包含作用域(链接到外部 foo 的词法环境)
  4. 由于变量abboo中使用,它们也存储在内存中。foo 的词法环境包含指向ab的链接

因此,只要有moo,变量ab就会存储在内存中。在这种情况下,我们可以将 moo 设置为null。在此之后,垃圾收集器将无法从根到达 a 和 b。这意味着变量将被自动删除。


推荐阅读