【问题标题】:Strange behavior of ES6 destructuring in Chrome consoleChrome 控制台中 ES6 解构的奇怪行为
【发布时间】:2018-02-16 21:18:57
【问题描述】:

环境

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)有关系吗?

更新

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

【问题讨论】:

  • 这是一个有效的语法吗?你并没有完全破坏任何东西。例如,[a, b] = [1, 2] 可以很好地解构
  • 嗨@VamshiGudipati,是的,代码确实无效,我在问输出的原因。

标签: javascript google-chrome ecmascript-6 destructuring


【解决方案1】:

是的,这与时间死区有关 - 实际上是两次。

问题一

您正在尝试使用b 作为a 在初始化之前的默认值。评估从左到右进行,而both a and b are already declared 它们确实按顺序初始化。使用let [a = 1, b = a] = [] 可以。

问题二

在变量声明和初始化之间的全局范围内引发错误。您可以将测试用例简化为

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

这确实声明了变量a,但从未初始化它,因为之前发生过异常。通常 - 在本地范围内 - 这不是问题,因为此处声明 a 的范围是例外。它在全局范围内有所不同 - 变量永远保持声明但未初始化。它在永恒中死去(时间区是“永远”)。见here for more details

【讨论】:

    【解决方案2】:

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

    使用

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

    它说a 已经被声明的原因是因为它首先声明a,然后它尝试将b 分配给它(尚未声明)然后代码错误,但是@ 987654325@已经被声明了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多