将变量从时间死区中取出

时间:2016-04-15 16:18:38

标签: javascript ecmascript-6 variable-declaration

请参阅此代码:

<script>
let {foo} = null; // TypeError
</script>
<script>
// Here I want to assign some some value to foo
</script>

第一个脚本试图通过解构赋值来声明foo。但是,null无法解析,因此赋值会引发TypeError。

问题是然后foo变量被声明但未初始化,所以如果在第二个脚本中我试图引用foo,它会抛出:

foo = 123; // ReferenceError: can't access lexical declaration `foo' before initialization

let个变量无法重新声明:

let foo = 123; // SyntaxError: redeclaration of let foo

有没有办法将它从TDZ中取出,以便我可以分配值并读取它们?

1 个答案:

答案 0 :(得分:2)

这是不可能的。预计临时死区和对未初始化let变量的限制访问将是不可避免的。这是令人困惑和有问题的,但有意和期望。

有关详细信息,请参阅spec

  

注意let和const声明定义了作用于正在运行的执行上下文的LexicalEnvironment的变量。 变量是在实例化包含词法环境时创建的,但在评估变量的LexicalBinding之前可能无法以任何方式访问。当LexicalBinding被评估时,由LexicalBinding和Initializer定义的变量被赋予其Initializer的AssignmentExpression的值,而不是在创建变量时。如果let声明中的LexicalBinding没有Initializer,则在评估LexicalBinding时,会为变量赋值undefined。\

因此,如果变量未在声明中初始化(并且在初始化之前抛出显然导致无法初始化),则无法通过任何方式访问它。

但事实上,你的问题比投掷分配更复杂。这是体系结构问题 - 您依赖于可变的全局变量。这是很大的“不不不”,你应该重构代码以使用显式依赖。