日期:2014-05-16 浏览次数:20531 次
网上说JS是单线程执行的,所以不存在异步的问题,于是自己设计了一个小例子来证明(如设计不够严谨,欢迎拍砖):
思路是:
假设是多线程,
预期:如果是多线程,那主线程结束的时候(即跳出警告窗口时),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>