Web前端开发QQ群 110939958-业余程序员

超长叠代

for(var i=0; i<1000000; i++) {
    //do some thing.
}

话说以上代码很可能会被浏览器判作执行超时。

试验了一下可以用浏览器的延时来做:

(function() {
    //do some thing.
    setTimeout(arguments.callee, 0);
})();


这样一来CPU倒是基本没有,但是这样的代码运行过慢,所以综合一下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title> new document </title>
  <script type="text/javascript">

	var interval = function(f, o) {
		var _onceRunTime = 5000;//每5秒一个新的任务队列
		var i = 0;
		(function() {
			var _st = new Date().getTime();
			while(true) {
				if(new Date().getTime() - _st > _onceRunTime) break;
				if(!f.call(o, i)) return;
				i++;
			}
			setTimeout(arguments.callee, 0);
		})();
	};
	function run(i) {
		document.getElementById("log").value = i;
		return i<1000000;
	}

	function test() {
		interval(run, this);
	}
  </script>
 </head>

 <body>
  <input type="text" id="log" /> <button id="b" onclick="test();">start</button>
 </body>
</html>

注意运行时也会使浏览器无反应,不过在每一个任务队列结束时仍然有机会刷新面。

One Comment

  1. 城晓 说:

    NND,刚才试时FF没反应一直等到数完。。。

发表评论

电子邮件地址不会被公开。 必填项已被标记为 *

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>