Javascript Temporal Dead Zone

时间:2017-12-04 13:34:16

标签: javascript scope hoisting

我真的不明白下面的代码片段会发生什么。

由于时间死区,我预计会出现错误,但看起来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();




2 个答案:

答案 0 :(得分:2)

不需要悬挂。

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

在定义常量并为其指定值之前,不要调用它们。

答案 1 :(得分:0)

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声明的方式。这个特殊的例子很好地说明了声明如何被提升,因为嵌套词法上下文中的引用确实起作用,因为符号是由这些函数中的代码实际运行的时间定义的。