【问题标题】:Javascript Temporal Dead Zone [duplicate]Javascript时间死区[重复]
【发布时间】: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 死区,所以如果你只访问变量(在你的函数调用中)之后初始化你很好。如果您之前调用了该函数,它仍然会访问该范围内的相同“提升”变量,但它会抛出异常。

标签: javascript scope hoisting


【解决方案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】:

不需要吊起来。

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

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

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 2012-09-24
    • 2021-06-25
    相关资源
    最近更新 更多