词法环境隔离的本质是javascript在解析阶段为每个作用域单元分配独立的变量登记簿,由环境记录和外部词法环境引用构成,形成不可变的作用域链;es6中let/const使普通代码块也能创建独立词法环境实现块级隔离。

词法环境隔离的本质,是 JavaScript 在代码定义时就为每个作用域单元分配独立的“变量登记簿”,彼此不共享、不干扰。这种隔离不是靠运行时控制,而是在解析阶段就固化下来的结构关系。
词法环境由什么构成
每个词法环境包含两个核心部分:
- 环境记录(Environment Record):真实存储变量和函数声明的地方,比如 let/const/var 定义的标识符
- 外部词法环境引用(Outer Lexical Environment):指向其外层作用域的词法环境,形成链式结构(即作用域链)
例如,在 if 块、for 循环或函数体内声明的变量,都会触发新词法环境的创建,且该环境的“外部引用”明确指向它语法上所嵌套的上一级环境。
块级作用域如何实现隔离
ES6 引入 let 和 const 后,普通代码块(如 {})也能生成独立词法环境:
- if (true) { let x = 1; } ——
x只存在于这个大括号内,块结束即不可访问 - for (let i = 0; i i
- 与
var对比:var不创建块级词法环境,只绑定到最近的函数作用域,所以没有真正隔离
函数作用域的词法环境更严格
函数是词法环境的“天然分界线”:
- 每次函数定义,JavaScript 引擎就为其创建专属词法环境,并把其外部引用设为定义位置所在的词法环境
- 即使函数被返回或传到别处执行,它的外部引用不会变——这就是闭包能访问外层变量的根本原因
- 同一函数多次调用,每次都会新建一个词法环境(比如参数、内部 let 变量),互不影响
全局词法环境是起点
全局作用域也对应一个词法环境,它是所有其他词法环境的顶层父级:
- 浏览器中,它通常与
window对象关联(但不等同) - 模块脚本(
type="module")的顶层不是全局词法环境,而是模块级词法环境,天然隔离于全局 - 严格模式下,未声明直接赋值的变量不会自动挂到全局词法环境中,进一步强化隔离
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











