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
我正在尝试 '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