证实JS中window.setTimeout函数为单线程
证明JS中window.setTimeout函数为单线程
网上说JS是单线程执行的,所以不存在异步的问题,于是自己设计了一个小例子来证明(如设计不够严谨,欢迎拍砖):
思路是:
假设是多线程,
- 主线程执行start()函数,启动setTimeout后,自己休眠10秒钟后输出i的值===》为10
- 子线程一秒钟将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?