我知道当我在循环中声明一个let变量时,该变量会在每个周期中被声明。例如:
for(let i=0 ; i<3 ; i++)
{
let x=1;
}
变量x
在循环中声明了3次,每个变量分配了不同的内存空间。
但是变量i
会发生什么?它只声明一次吗?
还是只初始化一次,但也声明了三次?
我想了解背后发生了什么。
我知道当我在循环中声明一个let变量时,该变量会在每个周期中被声明。例如:
for(let i=0 ; i<3 ; i++)
{
let x=1;
}
变量x
在循环中声明了3次,每个变量分配了不同的内存空间。
但是变量i
会发生什么?它只声明一次吗?
还是只初始化一次,但也声明了三次?
我想了解背后发生了什么。
使用 let
关键字,i
只会被声明一次,并且每个循环都会得到一个新的绑定。它的作用域仅限于块级语句内部。
在循环中,如果你使用
let
声明一个变量,那么每次迭代都会获得一个新的 绑定。允许你这样做的循环有:for
、for-in
和for-of
。
for (let i = 0; i < 3; i++) {
let x = 1;
setTimeout(() => console.log(i), 1000);
}
以下是与创建新绑定有关的赋值示例。
for (let x = { v: 0 }; x.v < 2; x.v += 1) {
setTimeout(() => console.log(x), 100); // same values
}
for (let x = { v: 0 }; x.v < 2; x = { v: x.v + 1}) {
setTimeout(() => console.log(x), 100); // different values
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
for (let x={v:0}; x.v < 10; x.v += 1) { console.log(x);}
,除非浏览器将其变成了const
,.. 无论如何,当不需要时进行复制似乎非常浪费。 - Keith如果你使用 let
,i
将在每个循环中声明。
如果你使用 var
,i
只会被声明一次。
如果你使用 const
,i
不会在每个循环中被声明(它的作用域与循环相同)。尝试这样做,你将会得到一个错误:
for (const i = 0; i < 9; i++) {
console.log(i);
// more statements
}
错误:未捕获的类型错误:常量变量赋值。
参考此处。
i
只被声明了一次,x
被再次声明了,但不用担心。内部的 V8 引擎或者你的浏览器所使用的引擎会对x
进行优化。 - Keithi
的变量。 - ASDFGerte