【发布时间】:2026-01-06 07:10:02
【问题描述】:
ES6 标准提出了 Temporal Dead Zones,使得在评估词法绑定之前无法以任何方式引用变量。那么在词法环境初始化时创建变量意味着什么
- 程序员?
- 编译器?
使用var 声明的变量声明在以前对程序员来说可能意味着什么,但现在有了 TDZ,javascript 是否开始像 java 一样为此目的?除了 javascript 解释器的工作方式之外,还有什么原因让我们首先提升(因此是 TDZ)?
如果由于执行顺序而在代码中稍后遇到词法绑定,即使代码出现在词法上,会发生什么情况?
let abc = f();
let b;
f(){ return b;}
像 java 这样的传统编程语言何时创建变量?什么时候遇到变量声明?或者什么时候初始化词法范围?
【问题讨论】:
-
可能是因为很多问题一般google都能解决
-
不是真的,我尝试了其中的大多数,比如 java 之类的语言何时创建变量,却空手而归。大多数资源 TBZ 都有很好的解释,但他们没有解释为什么我们首先想要它,因为现在是否提升变量并不重要(仅块范围的元素)
-
@sasidhar,“创建”变量有多个不同的步骤。您是在谈论它们何时被识别为变量?您是在谈论他们的内存地址空间何时被填充?许多语言以截然不同的方式“创建”变量,您必须查看每种语言在语言上下文中的处理方式。
-
我认为 es6 变化不大,只是在使用
let时将其澄清并将其应用于块而不是函数。看看咖啡脚本的 js 输出如何在顶部列出所有 var,并想象 js 函数在内部做同样的事情。 var 是“可见但为空的”,直到您为其赋值。 -
@dandavis 我不同意,es6 有重大影响,TDZ 现在使
typeof验证成为不可能。 TDZ 是强制更改,如果不是这种情况,那么它将是功能范围更改为块范围的简单情况。