1、解释如下代码为什么会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
JS函数分为同步和异步两种情况,这里简单说以下两者的区别:
(1) 同步函数:根据函数的调用顺序依次执行,后面的代码始终是在前面的代码执行完毕的基础上才开始执行。
(2) 异步函数:异步函数被调用时,如setTimeout,ajax等异步函数会交由指定的模块处理,不影响同步函数的执行,在异步函数达到触发条件,比如setTimeout的定时器到时或者ajax请求得到了返回,那么会把相应的回调函数压入指定队伍列中,等到主线程的任务队列为空时,再依次取出异步函数的回调进行执行。
对以上代码的解释是:在for循环中调用setTimeout对i进行打印,尽管定时器的时间为0,但是由于setTimeout的异步函数,会等到所在环境中的其他代码执行完毕以后再执行回调,也就是等到for循环完毕,i的值为6时,开始对6次循环中的定时器回调函数一次执行,所以打印结果为6个6;
2、写出让上面代码打印 0、1、2、3、4、5 的方法
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
3、除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5
let i=0
for(i=0;i<6;i++){
!function (i){
setTimeout(()=>{
console.log(i)
},0)
}(i)
}