举例
在 JavaScript 里函数的执行时机不同会产生不同的结果,举例如下
例 1:常规顺序
let a = 1;function fn(){console.log(a)}fn() //1
例 2:赋值前调用函数 ```javascript let a = 1 function fn(){ console.log(a) } fn(); //1 a = 2
let a = 1; function fn(){ console.log(a) } a = 2; fn() //2
- 例 3:调用后使用 setTimeout 延迟执行```javascriptlet a = 1function fn(){setTimeout(()=>{console.log(a)},0)}fn();a = 2 //2
结论
问题
所以当 for 循环和 setTimeout 一起使用时,会不能正常打印出结果
let i = 0for(i = 0; i<6; i++){setTimeout(()=>{console.log(i)},0)}// 6,6,6,6,6,6
想让上面代码打印 0、1、2、3、4、5 可以使用下面的方法
for(let i = 0; i<6; i++){setTimeout(()=>{console.log(i)},0)}// 0,1,2,3,4,5
- 将 let 写到 for 循环里面,这样每次 for 循环都会隐式的将变量 i 复制一个到函数中储存起来,这样函数每次执行时访问的是内部的变量 i ,可以输出正确的结果。
除了使用 for let 配合,还可以使用立即执行函数解决这个问题
for(let i = 0; i<6; i++){! function(a){setTimeout(()=>{console.log(a)},0)}(i)} // 使用立即执行函数,将变量 i 作为参数传进去
