var与let
setTimeout()使用var在for中定义
因为var在此定义的作用域是在函数内 (这里的 i 是函数局部变量),每一次循环的 i 是同一个 i
又因为setTimeout()函数与其内部的函数是异步执行的,即setTimeout()执行时,内部的函数(下图中timer())也在执行,
for函数执行完毕,但1s还没到,此时等待执行的函数是
console.log(i) console.log(i) console.log(i) console.log(i) console.log(i)
因为每个循环的 i 是同一个,所以最终输出6 6 6 6 6
for (var i = 1; i <= 5; i++) {
setTimeout(function timer() {
debugger;
console.log(i); // 输出6 6 6 6 6
}, 1000);
}
setTimeout()使用let在for中定义
因为let在此定义的作用域是在函数的块内 (这里的 i 是函数局部变量),每一次循环的 i 是相互独立的,即本次循环与下次循环的i是无关的
又因为setTimeout()函数与其内部的函数是异步执行的,即setTimeout()执行时,内部的函数(下图中timer())也在执行,
for函数执行完毕,但1s还没到,此时等待执行的函数是
console.log(i) console.log(i) console.log(i) console.log(i) console.log(i)
因为每个循环的 i 是同一个,所以最终输出1 2 3 4 5
for (let i = 1; i <= 5; i++) {
setTimeout(function timer() {
debugger;
console.log(i); //输出 1 2 3 4 5
}, 1000);
}