gpt4 book ai didi

javascript - 有TDZ为什么要提升变量

转载 作者:行者123 更新时间:2023-11-29 14:43:56 24 4
gpt4 key购买 nike

ES6 标准提出了临时死区,使得在评估词法绑定(bind)之前不可能以任何方式进行变量引用。那么词法环境初始化时的变量创建意味着什么

  1. 程序员?
  2. 编译器 ?

使用 var 声明的变量声明可能对以前的程序员有意义,但现在有了 TDZ,javascript 是否开始像 java 一样用于此目的?除了 javascript 解释器的工作方式之外,还有什么原因让我们首先提升(结果是 TDZ)?

如果由于执行顺序而在代码中稍后遇到词法绑定(bind),即使代码在词法上出现在词法绑定(bind)之前,会发生什么情况?

let abc = f();
let b;
f(){ return b;}

像 java 这样的传统编程语言什么时候创建变量?什么时候遇到变量声明?或者词法作用域何时初始化?

最佳答案

我有一种感觉,TDZ 的创建与它是 var 的一个非常卑微的步骤有关,而如果他们采用看似更合乎逻辑的方法,甚至不存在标识符,引擎就会有进行更深入的更改。至于你的问题的第二部分,关于其他语言何时“创建”变量,还有许多其他重要因素需要考虑,你似乎已经遗漏了,例如语言是解释还是编译,以及有多个“创建”变量的不同步骤。它在许多不同的情况下表现不同,并且没有单一的答案。事实上,这是存在许多不同语言的重要原因之一。

至于您的编码问题,这取决于您何时调用 f 函数,因为函数声明是在 javascript 中提升的。如果您在声明 b 之前调用它,那么您处于 TDZ 中并且无法引用 b。它的行为非常类似于您只是将 return b 放在调用此函数的任何地方。

老实说,似乎对 javascript 和一般的计算机语言存在一些潜在的误解。 Javascript 的“行为”并不更像 java,事实上,与 java 中的类型/变量声明相比,新的 let 关键字具有非常细微的行为,例如能够成为 block 作用域。我建议不要试图从其他语言的 Angular 来考虑 ES6 的变化; javascript 与许多其他语言不同,如果理解的话,将很难理解这些概念以及应该如何使用 javascript 进行编程。


编辑:

至于为什么会有变量和函数声明提升,那就是easily googlable.

关于javascript - 有TDZ为什么要提升变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com