核心:作用域链
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i++);
},4000)
}
console.log(i);
输出结果是:5、5、6、7、8、9
如果for循环中的var改为let
for(let i=0;i<5;i++){
setTimeout(function(){
console.log(i++);
},4000)
}
console.log(i);
输出结果是:
UncaughtReferenceError:i is not defined
0、1、2、3、4
如果想像let一样输出0-4,可以使用立即执行函数转为实参存值。
for(var i=0;i<5;i++){
(function(x){
setTimeout(function(){
console.log(x++);
},4000)
})(i);
}
console.log(i);
输出结果是:5、0、1、2、3、4
这样改为let也可以;let能固定值。
for(var i=0;i<5;i++){
let x= i
setTimeout(function(){
console.log(x++);
},4000)
}
console.log(i);
输出结果是:5、0、1、2、3、4
如果把上面的let改为var,console.log中的x不能转为实参存值了。
for(var i=0;i<5;i++){
var x= i
setTimeout(function(){
console.log(x++);
},4000)
}
console.log(i);
输出结果是:5、4、5、6、7、8
参考link:
js中Let和Var的区别
JavaScript闭包