JS函数的执行时机不同,函数运行的输出结果不同。
图1 | 图2 |
---|---|
setTimeout(()=>{
语句
},0)
- setTimeout是一个异步操作
- 执行完动作才执行语句(想象一下打游戏的时候,打完了才会去吃饭)
- 正常情况下应该像图1
- 但JS在for和let一起用的时候会加东西:每次循环会创建一个i(如图2)
- 把let换成var的结果同图1
为什么图1代码会是6个6
for循环执行最终结果为6,而循环过程i从0到6,执行6次。因此打印结果为6个6。
打印 0、1、2、3、4、5 的方法
方法一:如图2,将for和let连用。
for(let i = 0; i < 6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
方法二:闭包
for (var i = 0; i < 6; i++){
!function (j) {
setTimeout(() => {
console.log(j)
},0)}(i)
}
通过闭包将i的变量留在内存中,当输出j时,引用的是外部函数的变量i,i的值是根据循环来的,执行setTimeout时已经确定了里面的输出了
方法三:函数传参
for(var i = 0; i < 6; i++){
setTimeout((j)=>{
console.log(j);
},0,i);
}
给setTimeout添加第三个参数。
每次传入的参数是从for循环里面取到的值,所以会依次输出0~5
方法四:利用const关键字
for(var i=0;i<6;i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}