我们是否需要使用`for..of` /`for..in`循环进行变量声明

Ale*_*lls 0 javascript node.js

我在网上看到这样的例子:

const roles = [];

for (i of roles) {
  roleObj[roles[i].key] = true;
}
Run Code Online (Sandbox Code Playgroud)

我们不需要声明变量i,就像这样吗?

for (let i of roles) {
  roleObj[roles[i].key] = true;
}
Run Code Online (Sandbox Code Playgroud)

大量的文章正在推广第一个例子,这对我来说似乎很愚蠢:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

Exp*_*lls 5

你并不是绝对需要,但强烈建议这样做,事实上要使用let.需要注意的是使用let i在这种情况下,实际上将有不同的功能比,如果你只是做for (ifor (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.
Run Code Online (Sandbox Code Playgroud)

另请注意,在循环之后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
Run Code Online (Sandbox Code Playgroud)

此外,如注释中所述,在严格模式下不允许访问没有声明的变量.