日期:2014-05-16  浏览次数:20464 次

证明JS中window.setTimeout函数为单线程

网上说JS是单线程执行的,所以不存在异步的问题,于是自己设计了一个小例子来证明(如设计不够严谨,欢迎拍砖):

思路是:

     假设是多线程,

  1.  主线程执行start()函数,启动setTimeout后,自己休眠10秒钟后输出i的值===》为10
  2. 子线程一秒钟将n加1

   预期:如果是多线程,那主线程结束的时候(即跳出警告窗口时),n的值将等于11左右,肯定不等于2;

   执行结果:主线程结束时,n的值仍为2.

   结论:假设不成立,因此至少setTimeout是以单线程的回调实现的

<HTML>
	<BODY onload="start()">
		<div> 值1:<span id="val1"> </span> </div>
		<script type="text/javascript">
			function show(num){
				document.getElementById("val1").innerHTML = num;
			}
			
			function repeat(n){
				n++;
				show(n);
				window.setTimeout("repeat("+n+")",1000);
			}
			
			function start(){
				repeat(1);
				var i = 0;
				for(;i<10;i++){
					sleep(1000);
				}
				
				alert("值 i="+i);
				
			}
			function sleep(numberMillis) {      
				var now = new Date();      
				var exitTime = now.getTime() + numberMillis;     
				while (true) {   
				now = new Date();         
				if (now.getTime() > exitTime)   
					return;      
				}   
			}  
		</script>
	<BODY>

</HTML>


2楼qiushi888昨天 18:52
console.log(new Date());nsleep(1000);nconsole.log(new Date())nMon Nov 19 2012 18:56:15 GMT+0800 (CST)nMon Nov 19 2012 18:56:16 GMT+0800 (CST)n1秒钟不到就执行完了。。。。
1楼qiushi888昨天 18:48
你的sleep函数 确定可以让程序 听下来 10s?