Chrome 控制台中 ES6 解构的奇怪行为
Strange behavior of ES6 destructuring in Chrome console
环境
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 is not defined' 和 '标识符 'a' 已经同时声明了'?
第一个语句执行的魔法是什么?
是否与ES6有关“Temporal Dead Zone” (TDZ)?
更新
示例代码无效,我只想知道输出的原因。 :)
您甚至在声明 b 之前就试图将 b 分配给 a。
使用
let [b =1, a = b] = [];
它说 a
已经被声明的原因是因为它首先声明 a
,然后它试图将 b
分配给它(尚未声明)然后代码错误,但是 a
已经声明
是的,这与时间死区有关 - 实际上是两次。
一期
您正在尝试使用 b
作为 a
初始化之前的默认值。评估从左到右进行,虽然 它们确实按顺序进行了初始化。使用 let [a = 1, b = a] = []
会起作用。
问题二
在变量声明和初始化之间的全局范围内抛出错误。您可以将测试用例减少到
let a = (_ => { throw; })();
这确实声明了变量a
,但从未初始化它,因为之前发生了异常。通常 - 在本地范围内 - 这不是问题,因为此处声明 a
的范围是例外情况。它在全局范围内是不同的——变量永远保持声明但未初始化。 永远死去(时区"forever")。参见 。
环境
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 is not defined' 和 '标识符 'a' 已经同时声明了'?
第一个语句执行的魔法是什么?
是否与ES6有关“Temporal Dead Zone” (TDZ)?
更新
示例代码无效,我只想知道输出的原因。 :)
您甚至在声明 b 之前就试图将 b 分配给 a。
使用
let [b =1, a = b] = [];
它说 a
已经被声明的原因是因为它首先声明 a
,然后它试图将 b
分配给它(尚未声明)然后代码错误,但是 a
已经声明
是的,这与时间死区有关 - 实际上是两次。
一期
您正在尝试使用 b
作为 a
初始化之前的默认值。评估从左到右进行,虽然 let [a = 1, b = a] = []
会起作用。
问题二
在变量声明和初始化之间的全局范围内抛出错误。您可以将测试用例减少到
let a = (_ => { throw; })();
这确实声明了变量a
,但从未初始化它,因为之前发生了异常。通常 - 在本地范围内 - 这不是问题,因为此处声明 a
的范围是例外情况。它在全局范围内是不同的——变量永远保持声明但未初始化。 永远死去(时区"forever")。参见