JS 函数的执行时机

85 阅读1分钟

javaScript引擎属于单线程,只会在一段代码从上到下执行完毕,才会执行其它任务。 而setTimeout函数,意思是等一会儿执行,属于异步函数,只有在你执行完当前任务后,再返回来调用执行了setTimeout的函数。

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

所以在上图中的代码,按照从上往下的顺序执行,先声明i变量,再执行for循环,当进入到for循环里面时,发现有setTimeout函数,就直接把这个函数交给辅助线程,暂不处理,继续处理后面流程。于是又从来上面一段流程,直至结束这个任务时,再执行打印操作,而此时,变量i经过多次的for循环,此时已变成了6,所以最终打印出来的结果就是6个6。

如果要想打印出0,1,2,3,4,5的方法,可以选择的方式是声明时,在for循环中声明。即:

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

当把声明的变量放在循环中,JS会自动给变量i创建一个副本来保存此次的值,这时打印出来的值就是变量i的副本了。

如果还想用其它方式来打印0,1,2,3,4,5,也可以试着在for循环里用另一个变量来保存循环出来的变量再打印:

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

或把回调函数改为立即执行的函数:

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