《JavaScript权威指南》第四版中说“window对象方法setTimeout()用来安排一个JavaScript的代码段在将来的某个指定时间运行”。
setTimeout(foo,i); // foo是回调函数,i是延时时间
注意“将来”一词,setTime会把foo函数放到队列中,当线程空闲的时候,JavaScript才会去执行队列里的事件。
看下面的代码:
<!DOCTYPE HTML> <html> <head> <script type="text/javascript"> window.onload = function () { var a = 0; function one() { for (var i = 0; i < 10; i++) { console.log(i); setTimeout(function(){ console.log(a); a += i; },0); }; } function two() { alert(a); } one(); setTimeout(two,0); } </script> </head> </html>
这里其实one函数看着像是会正常把a从0加到9,然后alert出来。
但实际上的alert结果是100,为什么?
one函数的for循环是不会因为setTimeout停下的,它遇到setTimeout的时候只会把里面的回调函数放到队列里面去,然后继续i++。等执行完所有的for循环才会去执行刚才放到队列的函数。因为循环完了所以i是10,总共有10个相同的a+=i;操作的函数被调用,最后a的结果就变成了100了。
但是其实上面代码有部分我还是不明白,就是如果setTimeout(two,0);改成setTimeout(two(),0);的话,alert的结果就变成了0。
setTimeout的第一个参数是函数对象,如果变成two(),那回调函数就变成了two的返回值。
时间: 2024-11-02 23:27:30