ES6:'strict mode' 中 for 循环内的多重 let 赋值

ES6: Multiple let assignment inside for-loop in 'strict mode'

我正在尝试 'strict mode' 并在这样的 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

的缩减子集

问题如您所料,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 时引用的变量。

施工

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