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)
})
}
在這里插入圖片描述