关于JS中Script Scope及函数内var/let作用域差异的疑问
关于JS词法环境、作用域及var/let的疑问解答
一、函数内部var与let的底层区分逻辑
在函数执行前的词法环境创建阶段,函数环境记录会对var和let声明做差异化处理:
- var声明的变量:被归类到「变量绑定」集合,创建时直接初始化为
undefined。这就是为什么在函数内部var a1 = 1语句前访问a1,会得到undefined而非报错。 - let声明的变量:被归类到「声明式绑定」集合,创建时处于未初始化状态,并非直接设为
undefined。你调试时看到的undefined是调试工具的简化显示——实际上在执行到let b1这条语句前,任何访问b1的操作都会直接抛出ReferenceError,这正是暂时性死区(TDZ)的核心表现。
函数环境记录通过绑定类型追踪两种变量的状态,执行阶段会严格按照绑定类型执行访问规则:变量绑定允许提前访问(返回undefined),声明式绑定在初始化前访问则触发TDZ错误。
二、Script Scope的定义
Script Scope是JavaScript在**顶级作用域(非函数内部)**执行脚本时创建的特殊词法环境分支:
- 它与全局作用域(Global Scope)共享词法环境链,但存储内容完全分离:
- var声明的顶级变量会挂载到全局对象(浏览器端为
window,Node.js端为globalThis),属于Global Scope的一部分; - let/const/class等块级声明的顶级变量会单独存放在Script Scope的环境记录中,不会成为全局对象的属性,且受TDZ限制,只有执行到声明语句后才能访问。
- var声明的顶级变量会挂载到全局对象(浏览器端为
- 本质上,Script Scope是JS引擎为顶级块级声明专门划分的作用域空间,用来区分传统全局变量绑定与ES6新增的块级绑定,避免全局对象属性污染。
内容的提问来源于stack exchange,提问作者Sourish Mukherjee
相关产品推荐
相关产品推荐

