请问下面这段代码会打印什么结果
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
打印出6 个6
解析:
因为i
作用域,不属于 for 循环体,属于 global;等到for循环体结束,i
已经等于6了,这个时候再执行setTimeout的6个回调函数,里面的i
去向上找作用域,只能找到global下的 i
,就是6
解决办法,人为给console.log(i)
创造作用域,保存i
的值
解决方案一
let
for(let i =0; i < 6; i++) {
setTimeout(()=> {
console.log(i)
},0)
}
let作为代码块的作用域,每次for循环拿的都是for代码块作用域下的i
;就能得到 0,1,2,3,4,5,
setTimeout 延时 delay 毫秒之后,啥也不管,直接将回调函数加入事件队列。
解决方案二
立即执行函数
let i = 0
for (i = 0; i < 6; i++) {
(function(i) {
setTimeout(() => {
console.log(i)
}, 0)
})(i)
}
这样console.log(i)
中的i
就保存在每一次循环生成的立刻执行函数中的作用域里了
网友评论