image.png
上述代码打出6个6,与setTimeout(fn, time)的执行机制有关,setTimeout会将fn函数放入任务队列,等待主程序执行完毕(函数调用栈为空)后再调出任务队列中的fn函数执行,for循环每执行一次,就有一个fn进入了任务队列,等for循环执行完毕,i的值为6,这里的 i 是一个全局变量,每个fn里的 i 的值最终都是6,所以打出了5个6。

如果想要打出0,1,2,3,4,5,那么需要一种方法,每次for循环,都保存一个i的值传给fn,且不再改变

方法一

将let声明放到for的括号里面,每次for循环里的 i 都处于独立的块级作用域
image.png

方法二

使用立即执行函数传递参数,使得fn里的 i 变成局部变量
image.png