天天看点

一道刷到的js面试题

一道刷到的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结果如下

一道刷到的js面试题

因为在循环的时候,几乎是同时循环,也就是同时设置了5个定时器,外层那个,直接输出的是循环之后的结果,而里面的定时器,是同时设置,一秒之后同时输出循环“过后完“的结果,而不是0,1,2,3,4;

2,对比一下普通的循环

2.1

一道刷到的js面试题

2.2,里层输出0,1,2,3,4,外层输出5

一道刷到的js面试题

3,如果说让你把他的输出结果变成5->0,1,2,3,4,怎么办呢?

3.1用闭包,让他每循环一次,执行一次定时器

一道刷到的js面试题
一道刷到的js面试题

3.2,用es6语法,let,虽然外层报错,但是可以输出0,1,2,3,4

一道刷到的js面试题
一道刷到的js面试题

4,

继续阅读