1、 解释为什么如下代码会打印 6 个 6

  1. let i = 0
  2. for(i = 0; i<6; i++){
  3. setTimeout(()=>{
  4. console.log(i)
  5. },0)
  6. }

每一次进行for循环,setTimeout都会执行一次,但函数并没有被执行。这是因为函数是在在for循环的所有条件判断执行完成之后才会开始执行。而当执行完for循环后,i的值已经变为6了,所以执行函数会打印出6个6。i 定义的是一个全局变量,for循环每次获取的 i 值都会覆盖上次获取的 i 的值。

总结一下就是:for循环并没有在每次循环的时候输出 i 的值,而是在循环完成之后,i 已经变为了6之后,才进行的输出。

2、写出让上面代码打印 0、1、2、3、4、5 的方法

  1. for(let i = 0; i<6; i++){ //将i=0修改为let i = 0
  2. setTimeout(()=>{
  3. console.log(i)
  4. },0)
  5. }

3 、除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?

由题目一可知,由于i是个全局变量,导致每次i的值发生变化都会覆盖掉原先的值。所以这里可以在内部引入一个局部变量将i的值保存起来。

  1. let i = 0
  2. for(i = 0; i<6; i++){
  3. (function (i) {
  4. setTimeout(()=>{
  5. console.log(i)
  6. },0)
  7. })(i)
  8. }

这样输入后会返回0、1、2、3、4、5,但输出console.log(i)时会输出6.