代码:
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
//结果为 6 6 6 6 6 6
setTImeout是异步执行的,因此setTImeout在异步队列中,需要等待同步队列(for循环)执行完成后才可进行。以上代码在同步队列执行完成后,i的值为6,此时执行setTimeout,输出6个6。
修改:
for(let i=0;i<6;i++){
setTimeout(()=>{
console.log(i)
},0)
}
结果为 0 1 2 3 4 5
当for与let相结合使用时,JS做了特殊处理,每一次循环都会多创建一个i。
其他得到相同结果的方法:
a = (i) => console.log(i);
for (i = 0; i < 6; i++) {
setTimeout(a(i), 0);
}
函数在定义时不看变量,函数在运行时会找作用域内最新的变量