为什么里面是Var的时候,输出五次5,里面是let的时候,输出0,1,2,3,4呢?
for(var i =0; i<5; i++) {
setTimeout(function(){
console.log(i);
},1000);
}
为什么里面是Var的时候,输出五次5,里面是let的时候,输出0,1,2,3,4呢?
for(var i =0; i<5; i++) {
setTimeout(function(){
console.log(i);
},1000);
}
先走for循环,然后才会走里面的定时器。而定时器里面的console会在循环结束的时候执行,所以输出都是5.
而使用let之后,有了块级作用域,那么里面就形成了闭包,在闭包被调用之前,这个块级作用域内部的变量不会被销毁,所以输出0,1,2,3,4
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答889 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
for循环执行的顺序为:
1 var i=0
2 i<5
3 i++
for循环中使用var声明变量,其效果和循环外是一样的,相当于:
同步的循环执行完毕之后,i被赋值为5,所以异步的setTimeout定义的函数执行时,自然全部输出5;
当使用let的时候,每一次循环都有一个作用域,每个域都有不同的i,所以异步函数执行时,输出0,1,2,3,4