先看一段代码:
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
很简单的一段js代码,添加10个定时器,固定输出十次 i,可能很多人一眼看上去,就知道输出结果是下面这样的:
0
1
2
3
4
5
6
7
8
9
但其实并不是这样输出,正确输出是这样的:十次10
10
10
10
10
10
10
10
10
10
10
为甚么会这样?这就和var声明的变量的作用域有关了。setTimeout
在若干毫秒后执行一个函数,并且是在for
循环结束后。 for
循环结束后,i
的值为10
。 所以当函数被调用的时候,它会打印出 10
!
但是当使用let来声明i变量时,结果就会正确了:
for (let i = 0; i < 10 ; i++) {
setTimeout(function() {console.log(i); }, 100 * i);
}
0
1
2
3
4
5
6
7
8
9
预期一致。
const与let的声明的作用域是相同的,只是被const声明的变量,是不能被重新复制的,与java 的final关键字修饰有点类似