Javascript 什么是暂时的死区?
我听说在初始化之前访问Javascript 什么是暂时的死区?,javascript,ecmascript-6,constants,let,Javascript,Ecmascript 6,Constants,Let,我听说在初始化之前访问let和const值会导致ReferenceError,因为有一种叫做时间死区的东西 什么是暂时死区,它与范围和吊装有什么关系,在什么情况下会遇到这种死区?让和const与var有两大区别: 是的 在声明前访问var,结果未定义;在声明之前访问let或const会抛出ReferenceError: console.log(aVar);//未定义 console.log(aLet);//原因引用错误:未定义aLet var aVar=1; 设aLet=2吊装: let、co
let
和const
值会导致ReferenceError
,因为有一种叫做时间死区的东西
什么是暂时死区,它与范围和吊装有什么关系,在什么情况下会遇到这种死区?
让
和const
与var
有两大区别:
var
,结果未定义
;在声明之前访问let
或const
会抛出ReferenceError
:console.log(aVar);//未定义
console.log(aLet);//原因引用错误:未定义aLet
var aVar=1;
设aLet=2代码>吊装:
let
、const
、var
都是提升过程。
(这是什么意思?他们往上走,并在范围的顶部声明。)
初始化:
var
也要完成初始过程,并获取未定义的初始值
- 虽然
let
,const
没有抛出初始进程,因此它们的值仍然无法访问,尽管它们已经声明。
是什么让他们进入了时间死区
所以很快:
吊装过程:var
,let
,const
初始化过程:
var
对于let和const变量,时间死区基本上是一个区域
“在声明变量之前”
i、 e如果无法访问这些变量的值,它将抛出一个错误
前
上面的代码给出了一个错误
当我们对变量“a”使用var时,相同的代码不会给出错误
前
可能的重复-虽然问题的焦点不在TDZ上,但答案基本上是相同的,所以很有趣:@zeroplagl很好的链接,谢谢。它还说:“foo不是未声明的,它是未初始化的”,这种语言有助于澄清/更正上面的答案<代码>让foo
进入一个区块,使其被提升并在该区块顶部声明。let foo
行使其初始化。而且foo=xyz
会给它赋值。我认为这是一篇很棒的帖子!然而,我的印象是“let”不受吊装影响?我在Mozilla文档中发现了这一点:我不是想成为一个暴躁的人,我只是好奇,并愿意澄清。@jeows MDN页面仍然说他们没有被提升。如果你真的确定你在说什么,你应该试着编辑一下。我想我应该就此发布一个问题。@joews IMO,您可以说它们已被悬挂,但由于TDZ的原因,在其声明到达之前无法访问它们,或者您可以说它们未被悬挂,但TDZ将导致对它们的任何引用抛出错误。实际上,这两种说法都是同样正确的。除此之外,我认为,您在抽象意义上使用术语“提升”,如“提升=当引擎意识到该变量存在时”。这就是为什么?另外,规范对此有何规定?在第二个示例中,控制台日志生成“NaN”(添加未定义的和5
)。var a
的声明被挂起,初始化代码设置tnga
到5不被挂起。是的,对,a在没有任何初始化的情况下被挂起。因此a将是未定义的。引用的第一个示例不正确,请更正或删除它。我想还需要指出,let
和const
是块范围,var
是函数范围
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
var sum = a;
console.log(sum) //prints undefined
var a = 5;