JS函数执行时机

81 阅读1分钟

这样一段代码:

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

按照平时的想法,输出结果应该是0,1,2,3,4,5

但是实际输出的结果确实6,6,6,6,6,6

原因是setTimeout这个函数会让里面的代码console.log(i)等一会再执行,等多久呢,等到for循环完然后执行,此时的i已经自增到6了,打印六次就会都是6了

如图,for循环中的另一个打印输出六次‘---’之后,显示for返回值为undefined,然后再输出六次6,说明setTimeout是在for循环之后再打印的

想让for循环正常输出的方法:使用let声明i,并且放在for循环条件中

这是es6给新人专门做的优化

但是还有什么办法能够这样输出呢

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

上述结果输出为0,1,2,3,4,5

我的理解是将setTimeout中加一个立即执行函数,函数的参数就是此时for循环的i的值,此时打印在for循环完成之前就完了

在网上看到一段这样的代码,

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

也能按要求打出来,并且是在for循环结束之后打出结果