for循环中使用var和let的区别,以及加上定时器后执行出不同的效果?
这道题面试的时候经常被问,太闹心了,社会我x哥,是人狠话不多,直接上代码
// 使用var定义循环条件变量, +定时器 输出 3个3
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
// 使用let定义循环条件变量, +定时器 输出 0,1,2
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
- 个人总结了一波,
-
var+定时器
首先是定时器属于异步操作,会被放在异步队列中最后执行
但 由于i是由var 定义的 属于全局变量 , 当循环往下走时i也在不断的进行++
当循环走完之后 i已经变为最大值了,这时才来执行定时器,
这时定时器使用的i都属于全局变量 所以会全输出3 -
let+定时器, 因为lei定义的变量本身就是一个匿名函数自调用,生成了作用域和闭包
当循环一次时,会生成一个匿名函数,并自调用传入当前循环条件的变量参数
在这个匿名函数中这个变量就是唯一的,不会因为循环继续往下执行而导致i++
在加上定时器的异步队列 就会打印0,1,2
-