一、 解释为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
setTimeout
函数会优先执行之前的事件,最后再执行后续的事件。而之前的事件是i
循环,显然得等i
循环执行完毕再执行打印出i
的这个函数,当i
等于5时,因为小于6会再执行一次,直到i等于6,一共执行了6次,根据前面所诉会打出6个6,而非6个5。
二、写出让上面代码打印0、1、2、3、4、5
的方法
如果对于for循环使用setTimeout()的循行结果不满意,我们就是要打印0、1、2、3、4、5
呢?
可以这样写
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
// 0 1 2 3 4 5
因为在for
语句里用let
声明变量是局部变量遵循块作用域,所以每次for
循环执行时都会生成一个单独的作用域,也会生成一个新的i
,相当于有6个i
。 此时,每次执行setTimeout()
时都会打印出对应的i
,打印结果就是0、1、2、3、4、5
了。
三、其他方法可以打印出 0、1、2、3、4、5
let i = 0;
while (i < 5) {
i++;
console.log(i)
}
网友评论