JS 函数的执行时机

142 阅读1分钟

以下代码居然会打印出6个6

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

当第一次看见这个代码时,我理所当然的认为应该会打印出 0,1,2,3,4,5 但在chrome中运行时,却惊讶地发现该代码会打印出6个6

那么,这是为什么呢?

因为,此时的i是全局变量,每次进行for循环,i都会改变,循环完成时,i为6,此时打印,当然会打印出6个6。


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

当我们运行以上代码时,我们会发现,chrome会打印出 0,1,2,3,4,5

那么,这又是为什么呢?

因为,let 声明的i是局部变量,每次声明i,都相当于在一个新的块中生成了一个i,那么,此时打印,就会显示0,1,2,3,4,5


除了使用let,我们还可以利用闭包来解决这一问题

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

我们将每次for循环出来的i,重新作为参数传给j,也可以解决打印出6个6的问题!


function timer(i){
    setTimeout(console.log(i))
}

for(i = 0; i < 6; i++){
    timer.call(undefined,i)
}

同时,我们也可以将for循环 和计时打印拆分来解决6个6的问题