解釋為什么如下代碼會打印 6 個 6
先來看看以下代碼,其執(zhí)行結果是啥?
let i = 0;
for(i = 0; i < 6; ++i) {
setTimeout(() => {
console.log(i)
}, 0)
}
答案是 6 6 6 6 6 6
why?
這個例子似乎說明了以下的故事:小明正在打游戲, 媽媽喊他吃飯, 小明回答道: 馬上就去吃飯,然后接著打完(一會)游戲。
這就是setTimeout函數(shù)的原理,這里的
馬上就去就相當于setTimeout,吃飯就相當于console.log, 但實際上還是先完成當前的事情,即for 循環(huán)。
這就是所謂的執(zhí)行時機. 換句話說, 函數(shù)什么時候開始調用,什么時候才開始查詢參數(shù)的值。
如何正常打印理想結果
可以采用以下的方法來打印想要的結果
for(let i = 0; i < 6; ++i) {
setTimeout(() => {
console.log(i)
}, 0)
}
// 0 1 2 3 4 5
是否還有其他方法打???
有的,利用閉包的原理,將 i 的變量駐留在內存中,當輸出a時,引用的是外部函數(shù)A的變量值 i,i 的值是根據(jù)循環(huán)來的,執(zhí)行setTimeout時就可以確定里面的輸出。
for(var i=0;i<6;i++){
! function(i){
setTimeout(()=>{ console.log(i) },1000)
}(i) //在匿名函數(shù)后加 ( )立即執(zhí)行,并把 i 當作參數(shù) value傳入匿名函數(shù)循環(huán)執(zhí)行,參數(shù) i 和匿名函數(shù)組成了閉包
}