解释为什么如下代码会打印 6 个 6
先来看看以下代码,其执行结果是啥?
let i = 0;
for(i = 0; i < 6; ++i) {
setTimeout(() => {
console.log(i)
}, 0)
}
答案是 6 6 6 6 6 6
why?
这个例子似乎说明了以下的故事:小明正在打游戏, 妈妈喊他吃饭, 小明回答道: 马上就去吃饭,然后接着打完(一会)游戏。
这就是setTimeout函数的原理,这里的
马上就去
就相当于setTimeout
,吃饭
就相当于console.log
, 但实际上还是先完成当前的事情
,即for 循环
。
这就是所谓的执行时机. 换句话说, 函数什么时候开始调用,什么时候才开始查询参数的值。
如何正常打印理想结果
可以采用以下的方法来打印想要的结果
for(let i = 0; i < 6; ++i) {
setTimeout(() => {
console.log(i)
}, 0)
}
// 0 1 2 3 4 5
是否还有其他方法打印?
有的,利用闭包的原理,将 i 的变量驻留在内存中,当输出a时,引用的是外部函数A的变量值 i,i 的值是根据循环来的,执行setTimeout时就可以确定里面的输出。
for(var i=0;i<6;i++){
! function(i){
setTimeout(()=>{ console.log(i) },1000)
}(i) //在匿名函数后加 ( )立即执行,并把 i 当作参数 value传入匿名函数循环执行,参数 i 和匿名函数组成了闭包
}