Skip to content

词法环境

Lexical Environment:运行的函数的环境,包括 代码块、整个 script 所关联内部对象。

Lexical Environment 对象由两部分组成:

  • Environment Record / 环境记录 —— 是个对象,包括所有局部变量,也包括 this。
  • 外部词法环境 的引用,与外部代码相关联。

局部“变量”只是 Environment Record 的一个属性

所有的函数在“诞生”时都会记住创建它们的词法环境。
所有函数都有名为 [[Environment]] 的隐藏属性,该属性保存了对创建该函数的词法环境的引用。

调用函数时,会 自动创建 一个 新的 Lexical Environment,以存储这个调用的 局部变量 和 参数。

当代码要访问一个变量时,会搜索 内部词法环境,然后搜索 外部环境,然后搜索 更外部的环境,以此内推。

gc

函数 调用完成 后,词法环境(和其中的所有变量)会 从内存中删除。

但是闭包可以让他继续苟。

js
function f() {
  let value = 123;

  return () => ++value;
}

let g = f(); // 活着

g = null; // 死透了

V8 的优化

对于未使用的变量, V8(Chrome,Edge,Opera) 会试图优化 Lexical Environment, 即把它删点。

大多数时候,不会有问题,但是你应该知道这个问题。