JS 函数的执行时机

63 阅读1分钟

代码:

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);
}

函数在定义时不看变量,函数在运行时会找作用域内最新的变量