请参阅此代码:
<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中取出,以便我可以分配值并读取它们?
答案 0 :(得分:2)
这是不可能的。预计临时死区和对未初始化let
变量的限制访问将是不可避免的。这是令人困惑和有问题的,但有意和期望。
有关详细信息,请参阅spec:
注意let和const声明定义了作用于正在运行的执行上下文的LexicalEnvironment的变量。 变量是在实例化包含词法环境时创建的,但在评估变量的LexicalBinding之前可能无法以任何方式访问。当LexicalBinding被评估时,由LexicalBinding和Initializer定义的变量被赋予其Initializer的AssignmentExpression的值,而不是在创建变量时。如果let声明中的LexicalBinding没有Initializer,则在评估LexicalBinding时,会为变量赋值undefined。\
因此,如果变量未在声明中初始化(并且在初始化之前抛出显然导致无法初始化),则无法通过任何方式访问它。
但事实上,你的问题比投掷分配更复杂。这是体系结构问题 - 您依赖于可变的全局变量。这是很大的“不不不”,你应该重构代码以使用显式依赖。