JS 函数的执行时机

174 阅读1分钟

JS函数的执行时机不同,函数运行的输出结果不同。

图1图2
image.pngimage.png
setTimeout(()=>{
    语句
},0)
  • setTimeout是一个异步操作
  • 执行完动作才执行语句(想象一下打游戏的时候,打完了才会去吃饭)
  • 正常情况下应该像图1
  • 但JS在for和let一起用的时候会加东西:每次循环会创建一个i(如图2)
  • 把let换成var的结果同图1

为什么图1代码会是6个6

for循环执行最终结果为6,而循环过程i从0到6,执行6次。因此打印结果为6个6。

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

方法一:如图2,将for和let连用。

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

方法二:闭包

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

通过闭包将i的变量留在内存中,当输出j时,引用的是外部函数的变量i,i的值是根据循环来的,执行setTimeout时已经确定了里面的输出了

方法三:函数传参

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

给setTimeout添加第三个参数。

每次传入的参数是从for循环里面取到的值,所以会依次输出0~5

方法四:利用const关键字

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