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

JS函數(shù)的不同執(zhí)行時(shí)機(jī),會(huì)影響到函數(shù)運(yùn)行的輸出結(jié)果,不能通過(guò)代碼本身百分百判斷函數(shù)輸出什么,而是要根據(jù)函數(shù)具體的執(zhí)行時(shí)機(jī)。

1 看下方代碼

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

在這里插入圖片描述

上面的代碼執(zhí)行輸出了6個(gè)6,為什么呢?因?yàn)閟etTimeout是一個(gè)異步任務(wù),執(zhí)行到這里的操作會(huì)被瀏覽器丟到另一個(gè)任務(wù)隊(duì)列里去,瀏覽器這時(shí)候會(huì)繼續(xù)往下執(zhí)行,把下面的代碼都執(zhí)行完了才會(huì)來(lái)執(zhí)行setTimeout函數(shù)里的操作,這時(shí)候因?yàn)閒or循環(huán)已經(jīng)把i加到6了,所以輸出的全部都是6.

2 怎么樣讓上面代碼打印 0、1、2、3、4、5 ?

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

在這里插入圖片描述

將i定義到for循環(huán)體中,輸出的就是我們想要的結(jié)果了,為什么呢?

因?yàn)閘et變量的作用域只能在當(dāng)前函數(shù)中,所以每次for循環(huán)生成的都是一個(gè)新的i,setTimeout里輸出的i就是這個(gè)新的i,這個(gè)i是不會(huì)變化的,所以輸出的就是正常的。

3 除了使用 for let 配合,還有什么其他方法可以打印出 0、1、2、3、4、5

3.1 使用函數(shù)閉包,我們定義一個(gè)匿名函數(shù),并且把當(dāng)前的i當(dāng)做value傳進(jìn)入輸出,即可打印出正確結(jié)果
let i
for(i = 0; i<6; i++){
    !function(value) {
          setTimeout(()=>{
            console.log(value)
          },0)
    }(i)
}

在這里插入圖片描述
3.2 利用setTimeout的第三個(gè)參數(shù),將i傳進(jìn)去當(dāng)做value打印出來(lái)即可
let i
for(i = 0; i<6; i++){

          setTimeout((value)=>{
            console.log(value)
          },0,i)

}

在這里插入圖片描述
3.3 利用const關(guān)鍵字
let i
for(i = 0; i<6; i++){
    const x = i
    setTimeout(()=>{
       console.log(x)
     })
}

在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JS函數(shù)中,對(duì)函數(shù)調(diào)用的時(shí)機(jī)不同,得到的結(jié)果也會(huì)不一樣,例如 下面這段代碼 : 執(zhí)行結(jié)果如下 : 結(jié)果顯示打印出來(lái)...
    云卷云舒聽(tīng)雨聲閱讀 264評(píng)論 0 0
  • 一、關(guān)于“打印6個(gè)6”的解釋分析 ·首先聲明變量i,并賦值為0·進(jìn)行for循環(huán),循環(huán)次數(shù)為6次·循環(huán)過(guò)程中,i的值...
    scotton閱讀 84評(píng)論 0 0
  • JS函數(shù)的執(zhí)行時(shí)機(jī) 在解釋JS函數(shù)的執(zhí)行時(shí)機(jī)之前,先來(lái)看一個(gè)例子 將console.log打印出來(lái)是什么呢?答案是...
    茜Akane閱讀 183評(píng)論 0 0
  • 函數(shù)執(zhí)行時(shí)機(jī)不同,運(yùn)行結(jié)果也不同 同步任務(wù): 上一件事情沒(méi)有完成,繼續(xù)處理上一件事情,只有上一件事情完成了,才會(huì)做...
    盧盧2020閱讀 391評(píng)論 0 0
  • 一、 解釋為什么如下代碼會(huì)打印 6 個(gè) 6 setTimeout函數(shù)會(huì)優(yōu)先執(zhí)行之前的事件,最后再執(zhí)行后續(xù)的事件。而...
    快到碗里閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容