let i = 0
for (i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
以上代码并不会打出0、1、2、3、4、5,而是会打出6个6,这是 JS 函数执行时机的问题。
setTimeout()方法设置一个定时器,而当接受的 delay 参数(延迟毫秒数)设为 0 时,意味着“马上”执行,或者尽快执行。在“尽快执行”之前 JS 将会继续执行之前的代码,在示例代码中会继续执行 for 循环。当 for 循环执行完之后,再开始执行已经设置的6个定时器,也就是6个console.log(i),而此时由于每次循环都会执行一次i++,循环结束后变量 i 的值已经为6,所以会打出的是6个6。
如果希望打出0、1、2、3、4、5,可以按如下修改:
for (let i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
这样每次循环都会多创建一个变量 i。
或者先写出一个数组,再调用它的 forEach() 方法也可以实现打出0、1、2、3、4、5:
let arr = [0, 1, 2, 3, 4, 5]
arr.forEach.call(arr, (i => {
setTimeout(() => {
console.log(i)
},0)
}))