JS 函数的执行时机

98 阅读1分钟

为什么如下代码会打印 6 个 6

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  • 先执行完当前的代码,进行六次循环
  • 然后等会再执行打印动作(有六遍打印动作)
  • 因为执行完循环后,i等于6,然后再打印i,所以打印了六遍6

写出让上面代码打印 0、1、2、3、4、5 的方法

for(let i =0; i<6; i++){
    setTimeout(()=>{
        console.log(i)
    },0)
}
  • 因为JS在for和let一起用的时候会加东西
  • 每次循环会多创建一个i,新建的i都会留在里面
  • 为了符合新手程序员的想法

一个简单案例


let a = 1
function fn(){
    setTimeout(()=>{
        console.log(a)
    },0)
}

fn()
a=2
2

  • setTimeout(()=>{console.log(a)},0)的意思是一段时间后,尽快打印出a
  • JS先把当前代码执行完毕后
  • 才会做等会要做的事
  • 所以JS先让a=2
  • 而console.log(a)打印的时机是,a已经是2之后
  • 所以打印出2