调用函数意味着将代码存进内存,然后逐步执行,不同的调用时机会得到不同的结果。
如下代码会打印什么?
let i = 0
for (i = 0; i < 6; i++) {
setTimeout(() => {
console.log(i)
}, 0)
}
setTimeout方法的意思是尽快执行 ,也就是在手头的事情做完之后,再执行。这样的行文我们称之为异步任务。
执行时会被浏览器丢到另一个任务队列里去,浏览器这时候会继续往下执行,把下面的代码都执行完了才回来执行setTimeout方法里的代码,而这时候for循环已经把i加到6了,所以输出结果为6个6。
那么怎样修改,可以打印 0、1、2、3、4、5?
for (let i = 0; i < 6; i++) {
setTimeout(()=> {
console.log(i)
},0)
}
- 当let关键字用于循环体中声明i,let关键字自动帮你在每个循环体里拷贝一个i。因此每个打印出来的i都是当下的i。
除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?
let i = 0
for(i = 0; i<6; i++){
const/let x = i
setTimeout(()=>{
console.log(x)
}, 0)
}
- 只要手动把循环体里当前的i存储下来,就可以啦!