关于js的setTimeout和setInterval
刷微博,看到MR梁广彬 的微薄 “alert("1");setTimeout(function(){},5000);alert("2"); JS是异步执行的,我想"2"延迟出现有办法么?但我又不想把alert("2");扔进函数里面,呵呵!只是想理解探讨下!网上找了很多资料都找不到”
发现以前自己想问题都不深入,好像也没去认真想过setTimeout和setInterval这两个函数
做了个小测试
setTimeout(function(){console.log("0")},0);
console.log("1");
setTimeout(function(){console.log("2")},3000);
setTimeout(function(){console.log("3")},1000);
setInterval(function(){console.log("4")},2000);
console.log("5");
输出结果
1 5
0 3 4 2 4
第一行代码,虽然定时器为0ms,但是呢,它还是在1跟5之后才输出(ps:为什么?)
上网看到有一篇文章写得挺好的,好好看看看:http://www.laruence.com/2009/09/23/1089.html
这篇文章一开始看到我很纠结,看了几次,后来通过与MR梁广彬的一起纠结,终于发现有点明白了,用自己的话做的总结:
Javascript引擎是单线程的,真的单线程,然后,它有一个任务列表,js引擎从任务列表里面取任务出来执行,任务列表的一开始放着的是当前所在函数块,js处理着当前函数块,当遇到setTimeout跟setInterval的时候的时候,此时有浏览器的一个 定时计数器 出来工作了(注意,定时计数器不是js引擎的,,是浏览器的),所以,js引擎始终都是单线程,定时器工作,时间到就触发事件,事件放到任务列表里面,等待js引擎处理完前面的工作(ps:这就解决了上面的疑问,虽然触发时间为0ms,但是由于它是由定时器触发的,所以它在任务列表里面的位置是在原先所在函数块的后面,js引擎先处理完函数块的工作才来处理触发事件),所以,如果有两个任务的触发时间虽然相差很短,但是只要前一个任务还没执行完,就永远轮不到下一个,即使他们的触发时间相差几毫秒,事实上事件的实现可能会差几百毫秒,这就看前一个任务的执行时间了。。
JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.
JavaScript引擎用单线程运行也是有意义的,单线程不必理会线程同步这些复杂的问题,问题得到简化.