JS 函数的执行时机

242 阅读1分钟

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

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

setTimeout() 是一种异步代码,它会在同步代码执行完毕后执行。for 循环执行完毕后,此时任务队列中具有 6 个 console.log(i),而此刻的作用域中 i = 6(有且只有一个 i,用不到就近原则),所以会打印出 6 个 6。

2、打印 0、1、2、3、4、5 的方法

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

根据 ES6 标准,每次执行 for 循环时 i 都会被复制一份,所以在执行 setTimeout() 会存在 6 个 i,此时再打印,就会输出 0、1、2、3、4、5。

3、其他打印出 0、1、2、3、4、5 的方法

实例三:闭包
let i 
for(i = 0; i<6; i++){
  !function(j){
      setTimeout(()=>{
        console.log(j)
      },0)
  }(i)
}
实际四:数组的 push
var arr4 = [];
var  n = 0;
for(var i = 0;i<6;i++)
{
n+=1;
arr4.push(n-1)
}
console.log(arr4)
实例五:利用 setTimeout 的第三个参数,将 i 传进去
let i
for(i = 0; i<6; i++){
    setTimeout((value)=>{
      console.log(value)
    },0,i)
}
实例六:利用 const 关键字
let i
for(i = 0; i<6; i++){
  const x = i
  setTimeout(()=>{
    console.log(x)    
  })
}