var
var
声明的变量会被提升,但不会初始化。- 在循环中使用
var
声明的i
会在整个函数的作用域内共享同一个变量。 - 因此,外层的
i
会被循环修改,每次setTimeout
调用时都会打印出循环结束后的值,即 3。
let
let
声明的变量也会被提升,但它们不会被初始化。let
声明的变量具有块级作用域,这意味着每次循环迭代都会创建一个新的i
。- 因此,每个
setTimeout
调用都会捕获当前迭代的i
值,并在延迟后打印出该值。
for (var i=0;i<3;i++){
setTimeout(()=>console.log(i),1)
}
// 3 3 3
for (let i=0;i<3;i++){
setTimeout(()=>console.log(i),1)
}
// 0 1 2