let和var在for循环中的表现

var是函数作用域,只有函数能约束他的作用范围。而代码块做不到

for(var i=0; i<10; i++){
setTimeout(function(){
console.log(i);
},100)
} // 输出全是10
// 输出全是10的原因是因为i是全局变量,最后访问的都是全局变量i,而每次循环改变i的值就是改变全局变量的值,故而输出值均为10
// 之前对于这种问题的解决办法是通过闭包来实现
for(var i = 0;i<10;i++){
(function(){
var j = i;
setTimeout(function(){
console.log(j);
},100)
}())
} // 输出0123456789;
而let每次循环都创建一个块级作用域,并且存上i的值,这里面的let定义的i值就是局部变量,所以每次循环改变的就是对局部变量赋值,访问也是根据作用域链规则访问局部变量i这样就得到了最后的结果。

猜你喜欢

转载自www.cnblogs.com/rose7/p/11418772.html