var 声明
for(var i = 0; i<5; i++){ setTimeout(()=>console.log(i),0) // 5 5 5 5 5 }
上面的代码因为setTimeout是一个异步,所以它拿到的是循环结束后的i的值,
因为上面我们说的var是全局变量会被覆盖掉所以最后的i值是5,而且一共循环了5次(0-4),所以会打印五个5。
let 声明
for(let i = 0; i<5; i++){ setTimeout(()=>console.log(i),0) //0 1 2 3 4
}
上面的代码,因为在for循环中使用了let声明循环变量,
所以每一个值都会存在于单独的作用域不会被覆盖掉,因此,循环结束后得到的值是0,1,2,3,4
因为let有自己的作用域块,所以在for循环表达式中使用let其实就等价于在代码块中使用let