You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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限制,只有执行到声明语句后才能访问。
  • 本质上,Script Scope是JS引擎为顶级块级声明专门划分的作用域空间,用来区分传统全局变量绑定与ES6新增的块级绑定,避免全局对象属性污染。

内容的提问来源于stack exchange,提问作者Sourish Mukherjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:22:05