Chrome控制台

时间:2017-09-08 03:25:08

标签: javascript google-chrome ecmascript-6 destructuring

环境

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';

输出是: enter image description here

问题

有人可以解释为什么第一个陈述let [a = b, b = 1] = []使变量a变为' a未定义' '标识符' a'已经同时宣布'

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

它与ES6 “Temporal Dead Zone” (TDZ)有关吗?​​

更新

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

2 个答案:

答案 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已经声明