24.看下面代码,给出输出结果。
javascript
for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); };
答案:4 4 4。
原因:Javascript事件处理器在线程空闲之前不会运行。那么问题来了,如何让上述代码输出1 2 3? //原因这句话是什么意思呀?
javascript
for(var i=1;i<=3;i++){ setTimeout((function(a){ //改成立即执行函数 console.log(a); })(i),0); };
7 1 //输出
8 2
9 3
闭包的事情我就不多做解释了,其它人说的很多了,关于 "Javascript事件处理器在线程空闲之前不会运行" 这句话的意思我说一下吧。因为 JS 是单线程的,而 setTimeout 注册事件是队列的,setTimeout 放到队列之后,因为之前的
for
循环并没有执行完,所以不会立即执行 setTimeout 的。这也就是为什么说 JS 时间处理在线程空闲之前不会运行 的原因了。实际上 for 循环是这么走的: