函数的调用时机不同,得到的结果也是不同的。如果含有setTimeout()方法用于在指定毫秒后调用的函数或者表达式,那么得到的结果很有可能会不同。
1. 解释为什么如下代码会打印6个6
let i = 0
for (i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
原因是setTimeout是一个异步任务,执行时会被浏览器丢到另一个任务队列里去,浏览器这时候会继续往下执行,把下面的代码都执行完了才回来执行setTimeout函数里的操作,这时候因为for循环已经把i加到6了,所以输出的全部都是6
简单解释一下异步: 属于异步的代码是不直接执行的,是先执行下面的代码,当运行环境的代码全部执行完之后再回来执行异步代码。
2. 写出让上面代码打印 0、1、2、3、4、5 的方法
for (let i = 0; i < 6; i++) {
setTimeout(()=> {
console.log(i)
},0)
}
- 当let关键字用于循环体中声明i,let关键字自动帮你改为新手想要的结果,这就是JS变态之处。
3. 除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?
let i = 0
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
}, 0)
}
- 这里介绍一种方法: 直接使用const 声明一个变量,这个变量用于接收每次循环得到的i。打印时,打印的是const声明的变量,而const声明的变量不能重新赋值,所以打印出的结果是符合要求的。