日期:2014-05-16 浏览次数:20464 次
网上说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>