請問下面這段代碼會打印什么結(jié)果
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
打印出6 個6
解析:
因?yàn)?code>i作用域蹭秋,不屬于 for 循環(huán)體凿将,屬于 global;等到for循環(huán)體結(jié)束颊埃,i
已經(jīng)等于6了赌蔑,這個時候再執(zhí)行setTimeout的6個回調(diào)函數(shù),里面的i
去向上找作用域竟秫,只能找到global下的 i
,就是6
解決辦法娃惯,人為給console.log(i)
創(chuàng)造作用域,保存i
的值
解決方案一
let
for(let i =0; i < 6; i++) {
setTimeout(()=> {
console.log(i)
},0)
}
let作為代碼塊的作用域肥败,每次for循環(huán)拿的都是for代碼塊作用域下的i
趾浅;就能得到 0,1,2,3,4,5,
setTimeout 延時 delay 毫秒之后愕提,啥也不管,直接將回調(diào)函數(shù)加入事件隊(duì)列皿哨。
解決方案二
立即執(zhí)行函數(shù)
let i = 0
for (i = 0; i < 6; i++) {
(function(i) {
setTimeout(() => {
console.log(i)
}, 0)
})(i)
}
這樣console.log(i)
中的i
就保存在每一次循環(huán)生成的立刻執(zhí)行函數(shù)中的作用域里了