Google Chrome :61.0.3163.79 beta(64位)(群组:Beta)
JavaScript引擎:V8 6.1.534.32
在Chrome中,打开一个新标签页,在控制台中逐个输入以下代码:
let [a = b, b = 1] = [];
typeof a;
let a = 'other value';
a = 'other value';
有人可以解释为什么第一个陈述let [a = b, b = 1] = []
使变量a
变为' a未定义' 和'标识符' a'已经同时宣布' ?
第一个语句执行的魔力是什么?
它与ES6 “Temporal Dead Zone” (TDZ)有关吗?
示例代码无效,我只想知道输出的原因。 :)
答案 0 :(得分:1)
是的,这与时间死区有关 - 实际上是两次。
您尝试在b
初始化之前使用a
作为默认值。评估从左到右进行,而both a
and b
are already declared时它们会按顺序进行初始化。使用let [a = 1, b = a] = []
会有效。
变量声明与其初始化之间的全局范围内引发了错误。您可以将测试用例减少到
let a = (_ => { throw; })();
这确实声明了变量a
,但从未初始化它,因为之前发生了异常。通常 - 在本地范围内 - 这不是问题,因为此处声明a
的范围留有异常。它在全球范围内有所不同 - 变量保持永久声明但未初始化。它永远死了 (时区是"永远")。请参阅here for more details。
答案 1 :(得分:0)
您在尝试b之前尝试将b分配给a。
使用
let [b =1, a = b] = [];
它已经声明a
的原因是因为它首先声明a
,然后它尝试将b
分配给它(尚未声明)然后代码错误,但a
已经声明