Javascript ES6:在“严格模式”下为循环内部分配多个let
我正在尝试“严格模式”,并在for循环中使用关键字let,如下所示:Javascript ES6:在“严格模式”下为循环内部分配多个let,javascript,ecmascript-6,let,Javascript,Ecmascript 6,Let,我正在尝试“严格模式”,并在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 reduc
(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);
})();
这会产生一个未捕获的引用错误:未定义j,但通过删除“use strict”,代码运行良好
代码是my的一个子集。正如您所料,问题在于for循环中的initialiser语句:
let i = j = 0;
此声明与以下内容相同:
let i = (j=0);
这与:
j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;
如果要修复strict mode错误,则需要显式地将j声明为一个变量,并使用let j=0
由于提升,它在松散模式下工作,这将在全局范围内创建变量j
编辑:Bergi是对的,我混淆了概念,由于范围链而不是提升,它在全局范围内可用。如果某个变量在局部范围内未声明,它将查看该变量的外部词法范围。如果它仍然没有在那里定义,它将继续沿着作用域链向上移动,直到到达全局作用域。如果仍然没有在那里定义,那么它会自动在全局范围中定义,这就是您每次使用j时引用的变量。问题正如您所预料的,for循环中的initialiser语句:
let i = j = 0;
此声明与以下内容相同:
let i = (j=0);
这与:
j = 0; // would throw : Uncaught ReferenceError: j is not defined
let i = j;
如果要修复strict mode错误,则需要显式地将j声明为一个变量,并使用let j=0
由于提升,它在松散模式下工作,这将在全局范围内创建变量j
编辑: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
建筑
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
试着这样做,你应该在使用之前分配j,对于让j,i=j=0;i