一道刷到的js面试题
例如这样一段代码,问输出的结果是什么
for(var i = 0;i<5;i++){//循环执行的时候,几乎同时设置了5个定时器,这些定时器在一秒的时候同时触发
setTimeout(function(){//而循环之后的输出是立即执行的
console.log(new Date,i)
},1000)
console.log("直接输出",new Date,i);
1,输出结果为5->5,5,5,5,5,先立即输出了一个5,然后又同时输出5,5,5,5,5结果如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csUTRq5kMBpnTwEleYhnRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcukjNzMTM0ITM3IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
因为在循环的时候,几乎是同时循环,也就是同时设置了5个定时器,外层那个,直接输出的是循环之后的结果,而里面的定时器,是同时设置,一秒之后同时输出循环“过后完“的结果,而不是0,1,2,3,4;
2,对比一下普通的循环
2.1
2.2,里层输出0,1,2,3,4,外层输出5
3,如果说让你把他的输出结果变成5->0,1,2,3,4,怎么办呢?
3.1用闭包,让他每循环一次,执行一次定时器
3.2,用es6语法,let,虽然外层报错,但是可以输出0,1,2,3,4
4,