代码:
function* foo() {yield 1;yield 2;yield 3;}const genr = foo();for (const item of genr) {console.log(item);}for (const i = 0; i <= 5; i++) {console.log("i", i);}

在这两段代码中,尽管两者都包含 for 循环,但它们的用途和行为有所不同,这也是为什么 const 在第一个循环中可以使用,但在第二个循环中会导致错误的原因。
-
第一个循环:
for...of循环- 在
for...of循环中,循环遍历的是一个可迭代对象(如生成器或数组),并在每次迭代时生成新的变量(在这里是item)。 const在for...of循环中的作用是为每次循环创建一个新的块作用域,item在循环体内仅为当前迭代中的值。- 在循环的每一次迭代中,
item都是从生成器(或其他可迭代对象)中获取的新值,且它在循环体内不会被改变。这种行为适合const的不可变性特性。
- 在
-
第二个循环:
for循环- 在
for循环中,你定义了一个初始化表达式、条件表达式、循环体和步进表达式。在这段代码中,你使用const声明循环变量i,并且设定它的初始值为0。 for循环需要在每次迭代中递增i(即i++),这相当于对i进行重新赋值。这与const的不可变性相矛盾,因为const声明的变量不能被重新赋值。- 因此,使用
const在for循环中会导致错误,因为i在每次循环迭代中需要递增。
- 在
解决方法是,在 for 循环中使用 let 来声明 i:
for (let i = 0; i <= 5; i++) {console.log("i", i);
}
这样做允许 i 在每次迭代中递增而不引发错误。