JS执行上下文完成后是否会保留在内存中(如果保留了对其中创建的词法环境的引用)?

时间:2019-06-28 12:17:46

标签: javascript

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

Image

即,当左侧的Execution上下文对象从堆栈中弹出时,它们是否会被垃圾回收,而如果[[Environment]]被闭包引用,则该垃圾仍保留?

也想知道:

是否执行ExecutionContext a)创建全局/窗口/模块类型对象,并b)设置其“ this”属性的值以指向它。 (其中global和window是ExecutionContext的属性)。

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

1 个答案:

答案 0 :(得分:2)

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

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. 相关联
  3. boo 链接到它自己的词法环境对象
  4. boo 的词法环境包含 Scope(链接到外部 foo 的词法环境)
  5. 由于变量ab 用于boo,因此它们也存储在内存中。 foo 的词法环境包含到 ab
  6. 的链接

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