相关疑难解决方法(0)

什么是暂时死区?

我听说在初始化之前访问letconst值可能会导致ReferenceError因为称为时间死区的东西.

什么是暂时死区,它与范围和吊装有什么关系,以及在什么情况下遇到?

javascript const let ecmascript-6

128
推荐指数
3
解决办法
2万
查看次数

这是时间死区的工作原理吗?

我一直试图弄清楚时间死区/解析letconst工作方式.这就是它似乎归结为(基于我在以前的问题中收到的文档和各种回答[例如这个这个 ],尽管这与一些答案存在分歧).这个摘要是正确的吗?

在作用域的顶部,JS引擎let foo;在相关作用域的顶部创建一个绑定(变量关键字和名称的关联,例如),这被认为是提升变量,但如果您尝试之前访问该变量它的声明的位置,JS抛出一个ReferenceError.

一旦JS引擎向下移动到声明(与"定义"同义),例如,let foo;引擎就会初始化它(为它分配内存并使其可访问).声明具有自我约束力.(这是对我来说没有意义的部分:绑定导致顶部的提升,但引擎不会初始化,直到它到达声明,这也有绑定效果.)如果没有赋值,变量的值设置为or undefined的情况let,如果const使用,SyntaxError则抛出a.

这里是参考规格说的:

ECMAScript 2019语言规范草案:第13.3.1节,Let和Const声明

let和const声明定义了作用于正在运行的执行上下文的LexicalEnvironment的变量.变量是在实例化包含词法环境时创建的,但在评估变量的LexicalBinding之前可能无法以任何方式访问它们.当LexicalBinding被评估时,由LexicalBinding和Initializer定义的变量被赋予其Initializer的AssignmentExpression的值,而不是在创建变量时.如果let声明中的LexicalBinding没有Initializer,则在评估LexicalBinding时,会为变量赋值undefined.

MDN Web Docs:让我们

让绑定在包含声明的(块)范围的顶部创建,通常称为"提升".与使用var声明的变量(将以未定义的值开头)不同,在定义其定义之前,不会初始化变量.在初始化之前访问变量会导致ReferenceError.变量在块的开始处于"临时死区",直到处理初始化为止.

javascript

6
推荐指数
1
解决办法
327
查看次数

变量声明与变量绑定相同吗?

MDN文档指出:

let 绑定是在包含声明的(块)作用域的顶部创建的,通常称为“提升”。与用 var 声明的变量不同,var 将以 undefined 值开始,而 let 变量在其定义被求值之前不会被初始化。在初始化之前访问变量会导致引用错误。从块开始直到处理初始化为止,该变量处于“临时死区”。

“绑定”指的是(和let的提升)只是关键字,还是只是创建存储空间(与关键字无关)?letconstlet

以前我以为变量关键字和变量名一起构成了一个声明,但是在我最近问的一个问题中,回答者说它们实际上是一个初始化。

javascript computer-science

4
推荐指数
1
解决办法
4950
查看次数

标签 统计

javascript ×3

computer-science ×1

const ×1

ecmascript-6 ×1

let ×1