我在网上看到这样的例子:
const roles = [];
for (i of roles) {
roleObj[roles[i].key] = true;
}
我们不需要像这样声明变量i吗?
for (let i of roles) {
roleObj[roles[i].key] = true;
}
很多文章都在宣传第一个例子,对我来说这似乎很愚蠢:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
您不一定需要这样做,但强烈建议您这样做,事实上使用let
。请注意,在这种情况下使用let i
的实际功能与仅使用for (i
或for (var i
的情况不同。
例如:
for (let i = 0; i < 10; i++) {
process.nextTick(() => console.log(i));
}
// print 0..9
for (var i = 0; i < 10; i++) {
process.nextTick(() => console.log(i));
}
// prints 10 ten times.
还要注意的是,使用let
,您将不能在循环后使用i
,但使用var
可以,如果不使用var
,变量将在全局范围内,因此如果它在函数内部,它的工作方式会有所不同:
function gl() {
for (i = 0; i < 10; i++) {}
for (var j = 0; i < 10; i++) {}
for (let x = 0; i < 10; i++) {}
console.log(i, j) // prints 10, 10
console.log(x) // runtime error
}
gl();
console.log(i) // prints 10
console.log(j) // runtime error
此外,正如注释中所提到的,在严格模式下不允许在没有声明的情况下访问变量。