for (var i = 0; i <= 3; i++) {
setTimeout(function () {
console.log(i);
},0);
}
for (var i = 0; i <= 3; i++) {
setTimeout(function (a) {
console.log(a);
}(i),0);
}
为什么结果是:
0
1
2
3
4 ,这里打印了4次
延迟的时间为0,为何先执行下面的for循环呢,为何上面的for循环打印的最终的i,下面的for循环是逐个打印呢?
1.setTimeout绑定的回调函数只是往Javascript的事件循环机制中注册了一个定时器,这个定时器只可能在当前时间循环的下一次事件循环中才有可能被执行(需要检查时间是否符合设置的时间点)
2.
是一个立即执行函数,在你setTimeout函数执行调用时就被执行了,而不是等到定时器到点后被执行
3.setTimeout(fn,0)并不是立即执行的语义,只是说在下一次时间循环到达时可以马上执行
4.打印4次4的问题
等价==>
输出4次4是因为javacript没有块作用域,只有函数作用域,一个函数在定义时其中俄变量的作用域就确定;函数中变量i的指向的a处声明的变量,在for循环结束后i的值就是4并且你定义了4个同样的定时器