【问题标题】:ES6: Multiple let assignment inside for-loop in 'strict mode'ES6:“严格模式”下的 for 循环内的多个 let 赋值
【发布时间】:2018-02-07 05:06:44
【问题描述】:

我正在尝试“严格模式”并在 for 循环中使用关键字 let,如下所示:

  (function() {

    "use strict";

    var numbers = [1,2,3,4,5];
    var value;


    for (let i = j = 0; i < numbers.length; i++) {
      j += numbers[i];
      value = j;
    }
      console.log ("\tThe reduced value is: ", value);    
  })();    

这会产生 Uncaught ReferenceError: j is not defined,但通过删除“use strict”,代码运行良好。

代码是我jsfiddle的缩减子集

【问题讨论】:

  • 试试这个方法,使用前先分配jfor (let j, i = j = 0; i &lt; numbers.length; i++) {
  • (如果没有严格模式,它不会运行 fine - 它悄悄地做错事。)
  • @AswinRamesh:虽然let j, i = j = 0 完全正确,但我更愿意使用let i = 0, j = 0。电脑不在乎,同事会感激不尽。 :P
  • 附带说明,value = [1,2,3,4,5].reduce((sum, next) => sum+next, 0);和上面的循环做同样的事情。
  • @Ryan。安静地创建一个没有严格模式的全局变量 j 我现在明白了。

标签: javascript ecmascript-6 let


【解决方案1】:

问题如您所料,for 循环中的初始化语句:

let i = j = 0;

此语句等同于:

let i = (j=0);

等同于:

j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;

如果要修复严格模式错误,需要将 j 显式声明为变量 let j = 0;

由于提升,它在草率模式下工作,这将在全局范围内创建一个变量 j。 (https://www.w3schools.com/js/js_hoisting.asp)

编辑:Bergi 是对的,我混淆了概念,由于范围链而不是提升,它在全局范围内可用。如果一个变量未在本地范围内声明,它会查看该变量的外部词法范围。如果它仍然没有在那里定义,它会继续沿着作用域链上升,直到它到达全局作用域。如果它仍然没有在那里定义,那么它会自动在全局范围内定义,这就是你每次使用 j 时引用的变量。

【讨论】:

  • 您可能想补充一下它在草率模式下“工作”的原因:它只是创建了一个全局 j 变量。几乎没有人想要 - 所以每个人都使用严格模式。
  • 不,这不是吊装的意思。
  • @Bergi 你如何定义提升?
  • @keithlee96 提升是指变量的可见性是它被声明的整个范围(而不仅仅是声明之后的部分)以及进入所说的初始化行为范围。但是j = 0 甚至没有在任何地方声明,它只是一个赋值,所以“提升”这个词根本不适用。
【解决方案2】:

建设

let i = j = 0

实际上与关键字let 无关。

让我们看看它在底层做了什么:

let i // declares i
j = 0 // assigns a variable j to 0 that is not declared
      // If it does not exist it creates the variable on the `window` object.
i = j // in fact i = window.j

正确使用

let i = 0, j = 0

【讨论】:

  • 这完全正确。接受的答案不是。
猜你喜欢
  • 2015-10-13
  • 2021-10-20
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多