Javascript Chrome控制台中ES6解构的奇怪行为 环境

Javascript Chrome控制台中ES6解构的奇怪行为 环境,javascript,google-chrome,ecmascript-6,destructuring,Javascript,Google Chrome,Ecmascript 6,Destructuring,谷歌Chrome:61.0.3163.79测试版(64位)(队列:测试版) JavaScript引擎:V8 6.1.534.32 代码 在Chrome中,打开一个新选项卡,在控制台中逐个键入以下代码: let [a = b, b = 1] = []; typeof a; let a = 'other value'; a = 'other value'; 输出为: 问题: 有人能解释为什么第一条语句让[a=b,b=1]=[]将变量a设为“a未定义”并且“标识符”a已同时声明“ 第一条语句

谷歌Chrome:61.0.3163.79测试版(64位)(队列:测试版)

JavaScript引擎:V8 6.1.534.32

代码 在Chrome中,打开一个新选项卡,在控制台中逐个键入以下代码:

let [a = b, b = 1] = [];

typeof a;

let a = 'other value';

a = 'other value';
输出为:

问题: 有人能解释为什么第一条语句
让[a=b,b=1]=[]
将变量
a
设为“a未定义”并且“标识符”a已同时声明“

第一条语句执行的魔力是什么

它与ES6有关吗

更新
示例代码无效,我只想知道输出的原因。:)

在声明b之前,您正试图将b分配给a

使用


它之所以说
a
已经声明,是因为它首先声明
a
,然后它尝试将
b
分配给它(尚未声明),然后是代码错误,但是
a
已经声明了是的,这与时间死区有关-实际上是两次

第一期 在初始化
a
之前,您试图将
b
用作
a的默认值。评估从左到右进行,同时按顺序初始化。使用
让[a=1,b=a]=[]
起作用

第二期 在声明变量和初始化变量之间的全局范围中引发了一个错误。您可以将测试用例简化为

let a = (_ => { throw; })();

这确实声明了变量
a
,但从未初始化它,因为之前发生过异常。通常-在本地作用域中-这不是问题,因为在这里声明
a
的作用域没有异常。它在全局范围内是不同的-变量永远保持声明状态,但未初始化。它在永恒中死去(时区是“永远”)。请参阅。

这是有效的语法吗?你并不是在破坏任何东西。例如,
[a,b]=[1,2]
会破坏fineHi@VamshiGudipati的结构,是的,代码确实无效,我正在询问输出的原因。
let a = (_ => { throw; })();