JS 函数的执行时机

194 阅读1分钟

JS执行是单线程从上而下执行,setTime(fn,time),此方法会等js代码执行完毕后time时间后再执行fn方法

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

上面此段代码的打印结果是6个6;为什么呢,是因为由于for循环,生成了6个定时器,当执行定时器里面的fn时,此时for循环已经执行完毕,i应变成了6,定时器此时访问到的i都是6;

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

上面一段代码,是把let i=0;放入到了for循环里面,计数器i只在for循环体内有效,在循环体外引用就会报错;变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量;而且JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。所以最终打印结果为0,1,2,3,4,5

其他方法实现与上例同样的结果

第一种

let i = 0
for(i = 0; i<6; i++){
let index = i;
  setTimeout(()=>{
    console.log(index)
  },0)
}

以上代码也可同样打印出0,1,2,3,4,5

第二种,利用setTimeout第三个参数

let i = 0
for(i = 0; i < 6; i++){
  setTimeout((j)=>{
    console.log(j)
  },0,i)
}

以上代码也可同样打印出0,1,2,3,4,5