JS 函數(shù)的執(zhí)行時機

解釋為什么如下代碼會打印 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ù)組成了閉包
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容