无法计算出简单 javascript 代码的输出
Unable to figure out the output of simple javascript code
function func2() {
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();
由于closure
,console.log
语句应该记住它的外部词法环境,首先是setTimeout
,然后是for循环。由于 i
在 setTimeout
上下文中不可用,它会在 for 循环的执行上下文中查找,并在那里搜索 i
的值。
现在,对于 console.log
的所有三个执行,该值在 2 秒后应该是 3。但它将输出显示为:
0
1
2
您使用了 let
,即 block scoped
,因此每个 for 循环迭代都会有单独的 i
。
1)如果你想输出连续的3
所以你可以在for-loop
之外声明i
,那么只有单个 i
,值为 3
。
function func2() {
let i;
for (i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();
2) 如果你想要相同的词法范围那么你也可以在这里使用 var
,
var
is function scoped, So there will only be one i
function func2() {
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();
function func2() {
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();
由于closure
,console.log
语句应该记住它的外部词法环境,首先是setTimeout
,然后是for循环。由于 i
在 setTimeout
上下文中不可用,它会在 for 循环的执行上下文中查找,并在那里搜索 i
的值。
现在,对于 console.log
的所有三个执行,该值在 2 秒后应该是 3。但它将输出显示为:
0
1
2
您使用了 let
,即 block scoped
,因此每个 for 循环迭代都会有单独的 i
。
1)如果你想输出连续的3
所以你可以在for-loop
之外声明i
,那么只有单个 i
,值为 3
。
function func2() {
let i;
for (i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();
2) 如果你想要相同的词法范围那么你也可以在这里使用 var
,
var
is function scoped, So there will only be onei
function func2() {
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 2000);
}
}
func2();