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();

所以有一个死区,但在死区内实际上没有发生;在死区之后之前,您不会调用函数,所以一切都很好。可以在嵌套函数上下文中的死区中提及符号。死区就是在实际声明点之前主动“触摸”一个悬挂的符号。

实际上,由于“时间死区”的概念,将constlet 声明视为像var 声明那样被“提升”并没有真正的意义。这个特殊的例子很好地说明了声明是如何被提升的,因为嵌套词法上下文中的引用确实有效,因为符号是在这些函数中的代码实际运行时定义的。

【讨论】:

我在哪里可以找到这方面的信息?你能提供一些来源吗? MDN 文档有一些信息。【参考方案2】:

不需要吊起来。

函数在被调用之前不会尝试访问变量。

在定义常量并为其分配值之前,您不会调用它们。

【讨论】:

以上是关于Javascript时间死区[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ECMAScript 2015 时间死区 [重复]

有啥用?和:[重复]

JavaScript高级程序设计第四版(let 声明临时死区全局声明条件声明)

在 Flask render_template 期间未使用相对路径找到 Javascript 文件 [重复]

仅第一个单词的大写首字母[重复]

在多个 div 上使用 Jquery 函数 [重复]