代码:
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
在每次迭代中递增而不引发错误。