1 为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
首先需要明白一件事,setTimeout(func,0)的情况下是怎么回事,设置的等待时间为0,并不代表立马执行,这样调度表示让 func 尽快执行。但是只有当前正在执行的脚本执行完成后,调度程序才会调用它。详细可了解以下JavaScript的事件循环 :zh.javascript.info/event-loop
也就是说,对于上述的代码来说,必须将for循环执行结束后才可以执行setTimeout,当 i===5 时满足判断条件i<6,之后执行循环体触发setTimeout等待,则执行i++操作,所以i为6,且不符合条件,for循环结束,接下来则执行刚才触发的setTimeout,i的变化为0 -> 1 -> 2 -> 3 -> 4 -> 5 ,一共触发了6次setTimeout,而i的最终值此时为6所以代码最后打印出6个6;
2 以下代码可打印出来 0、1、2、3、4、5
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
3 其余方法打印出0、1、2、3、4、5、
采用闭包的方式
for(var i=0;i<6;i++){
(function(j){ //j = i
setTimeout(function(){
console.log(j);
},0)
})(i);
}
console.log(i);
定时器
for(var i=0;i<6;i++){
setTimeout(function(j){
console.log(j);
},0,i)
}
console.log(i);