- 执行时机,或调用时机,是 JS 函数的要素之一
- JS 函数的执行时机不同,结果不同
「一」异步案例
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
// 上面代码会打印 6 个 6,而不是想象中的 0 1 2 3 4 5
🧐 为什么上面代码会打印 6 个 6 ?!
∵ setTimeout是一个异步任务,会等到当前代码的for循环执行完了,再去执行 console.log(i),而for循环执行完之后,i已经是6了
∴ 会打印出6个6
「二」如何让上面代码打出0、1、2、3、4、5
💡方法1
利用for
和let
配合
for(let i = 0; i < 6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 相当于每轮循环创建了一个作用域 { }
- 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次
- 那样的话,6 次循环,就会有 6 个不同的 i,console.log 出来的 i 当然也是不同的值
💡方法2
- 利用
setTimeout
的第三个参数,将i
传进去
let i
for(i = 0; i < 6; i++){
setTimeout((i)=>{
console.log(i)
},0,i)
}
💡方法3
- 利用
const
保存i
值
let i
for(i = 0; i < 6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}
💡方法4
- 利用「立即执行函数」的参数,保存下
i
值
for (var i = 0; i < 6; i++){
! function(j){
setTimeout(function(){
console.log(j)
}, 0)
}(i)
}