Javascript时间死区[重复]
Posted
技术标签:
【中文标题】Javascript时间死区[重复]【英文标题】:Javascript Temporal Dead Zone [duplicate] 【发布时间】:2018-05-17 23:45:05 【问题描述】:我不太明白下面的 sn-p 发生了什么。
由于时间死区,我预计会出现错误,但看起来const baz = '123123';
被提升了。
一切正常的原因是什么?
class Foo
constructor()
console.log('Foo baz is:', baz)
function log()
console.log('log baz is:', baz);
const baz = '123123';
log();
new Foo();
【问题讨论】:
这是一个 temporal 死区,而不是 syntactic 死区,所以如果你只访问变量(在你的函数调用中)之后初始化你很好。如果您之前调用了该函数,它仍然会访问该范围内的相同“提升”变量,但它会抛出异常。 【参考方案1】:const
声明已(某种程度)提升,因此您的代码看起来像这样:
const baz; // hoisted, sort-of
class Foo
constructor()
console.log('Foo baz is:', baz)
function log()
console.log('log baz is:', baz);
baz = '123123'; // not really possible because it's const
log();
new Foo();
所以有一个死区,但在死区内实际上没有发生;在死区之后之前,您不会调用函数,所以一切都很好。可以在嵌套函数上下文中的死区中提及符号。死区就是在实际声明点之前主动“触摸”一个悬挂的符号。
实际上,由于“时间死区”的概念,将const
和let
声明视为像var
声明那样被“提升”并没有真正的意义。这个特殊的例子很好地说明了声明是如何被提升的,因为嵌套词法上下文中的引用确实有效,因为符号是在这些函数中的代码实际运行时定义的。
【讨论】:
我在哪里可以找到这方面的信息?你能提供一些来源吗? MDN 文档有一些信息。【参考方案2】:不需要吊起来。
函数在被调用之前不会尝试访问变量。
在定义常量并为其分配值之前,您不会调用它们。
【讨论】:
以上是关于Javascript时间死区[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript高级程序设计第四版(let 声明临时死区全局声明条件声明)