for(var i = 0; i < 10; i++){
setTimeout(function(){
consoleLog();
},100);
}
function consoleLog(){
console.log(i);
}
1
2
3
4
5
6
7
8
结果是10次10。
for(var i = 0; i < 10; i++)
1
和
var i;
for(i = 0; i < 10; i++)
1
2
等价。
但是在let声明的时候则不一样,
for(let i = 0; i < 10; i++)
1
和
let i;
for(i = 0; i < 10; i++)
1
2
是不等价的,因为let声明只在代码块中有效。
但是,如果仅仅这样,我们或许很容易理解
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
1
2
3
4
5
得到10次10,然而为什么
for(let i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
1
2
3
4
5
得到0-9?
在setTimeout的时候,匿名函数function(){console.log(i);}会被声明创建,当匿名函数执行的时候,会查找当前运行环境的 i 的值。
var声明的 i ,运行环境的 i 的值为10,但是let声明的 i,运行环境中 i 的值是每一个循环创建匿名函数时候的 i。
所以得到了0-9的值。
let替换var,可以很好的解决闭包的问题。