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

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

思路是:

     假设是多线程,

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

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

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

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

<HTML>
	<BODY οnlοad="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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值