上述代码打出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 都处于独立的块级作用域
方法二
使用立即执行函数传递参数,使得fn里的 i 变成局部变量