Javascript中的setTimeout,setInterval,requestAnimFrame

这三种方法我们平时初学的时候可能容易混淆,下面我们将使用例子的形式来阐述这三种方法不同的用法。

setTimeout:Calls a function or executes a code snippet after a specified delay.(在特定的时间后执行方法和代码块)

语法:var timeID = setTimeout(func|code,delay)

	<script type="text/javascript">
		/*第一种写法
		function f(){
			console.log("HI");
		}
		setTimeout(f,1000);
		*/

		/*第二种写法
		setTimeout("console.log('aaa')",2000);
		*/                                                                                                                                                        //第三种写法
		setTimeout(function(){console.log("bbb")},2000);
	</script>

在2秒之后执行输出操作

复杂一点例子:

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
		/*
			延迟几秒后调用该方法
		*/
		var timeoutID;
		function delayedAlert(){
			timeoutID = window.setTimeout(slowAlert,2000);
		}
		function slowAlert(){
			console.log("That was really show~");
		}
		function clearAlert(){
			window.clearTimeout(timeoutID);
		}
	</script>
</head>
<body>
	<p>Live Example</p>
	<button onclick="delayedAlert();">Show an alert box after two seconds</button><p></p>
	<button onclick="clearAlert();">Cancel alert before it hanppeds</button>
</body>
</html>

打开页面并打开浏览器控制台,点击"show
an alert..." 按钮,就看到我们在2秒后在控制台输出"That was really show~~~"  点击一次2秒后就输出【可以点击多次哦~】

点击“Cancel alert before it happends” 按钮后,就能够取消正在执行的delayedAlert()方法【执行完打印输出后就没作用了~】

让我们再来看setInterval()方法

setInterval() : Calls
a function or executes a code snippet repeatedly, with a fixed time delay between each call to that function. Returns an intervalID.(在时间间隔内永久重复的执行函数和代码块,返回一个intervalID),下面是一个颜色变幻的例子:

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<script type="text/javascript">
	    /*
			和前面的setTimeout 挺相像的
			有一个nItervId,清除的时候就用clearInterval(id)方法清除就可以了~
	    */
		var nIntervId;
		function changeColor(){
			nIntervId = setInterval(flashText,500);
		}
		function flashText(){
			var oElem = document.getElementById("my_box");
			oElem.style.color = oElem.style.color == "red" ? "blue" : "red";
		}

		function stopTextColor(){
			clearInterval(nIntervId);
		}
	</script>
</head>
<body onload="changeColor();">
	<div id="my_box">
		<p>Hello World!</p>
	</div>
	<button onclick="stopTextColor();">Stop</button>
</body>
</html>

上述例子会在0.5秒后执行颜色变幻功能,并永久不断的执行下去。当然我们点击Stop按钮,就可以停止颜色变幻,这里的clearInterval(nIntervId) 是根据我们setInterval方法返回的ID来停止使用他们的。

最后来说对我比较陌生的window.requestAnimFrame,这个方法给我们在绘制的过程中有一个平滑的过渡,这个方法的性能比setTimeout和setInterval要好点。所以接下来我们将介绍它怎么使用。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>startGirl</title>
</head>
<body onload="init()">
	<div>
		<canvas id="canvas" width="800px" height="600px"></canvas>
	</div>
	<script type="text/javascript">
		/*
			拿到我想要的canvas
		*/
		var can;
		/*
			绘制2D图形的context
		*/
		var ctx;
		/*
			定义宽高
		*/
		var w;
		var h;
		function init(){
			can = document.getElementById("canvas");
			ctx = can.getContext("2d");
			w = can.width;
			h = can.height;
			console.log("canvas w:"+w);
			console.log("canvas h:"+h);
			drawLoop();

		}
		function drawLoop(){
			window.requestAnimFrame(gameLoop);
			fillCanvas();

		}
		function fillCanvas(){
			ctx.fillStyle = "#393550";
			ctx.fillRect(0,0,w,h);
		}                                                                                                                                                         //浏览器的兼容设置
		window.requestAnimFrame = (function() {
			return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
				function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
					return window.setTimeout(callback, 1000 / 60);
				};
		})();
	</script>
</body>
</html>

我们可以在这个网站看到setTimeout和requestAnimFrame性能参数的比较。http://ie.microsoft.com/testdrive/graphics/RequestAnimationFrame/Default.html#

tips :在我们实际项目绘画的过程中,不推荐使用多个setInterval()或setTimeout()一起使用,他们会占用CPU性能。

转载请注明出处:Coder的不平凡 http://blog.csdn.net/pearyangyang/article/details/45561115

时间: 2024-11-10 19:35:49

Javascript中的setTimeout,setInterval,requestAnimFrame的相关文章

关于JavaScript中的setTimeout()链式调用和setInterval()探索

http://www.cnblogs.com/Wenwang/archive/2012/01/06/2314283.html http://www.cnblogs.com/yangjunhua/archive/2012/04/12/2444106.html 下面的参考:http://evantre.iteye.com/blog/1718777 1.选题缘起 在知乎上瞎逛的时候看到一个自问自答的问题: 知乎上,前端开发领域有哪些值得推荐的问答?,然后在有哪些经典的 Web 前端或者 JavaScr

JS中定时器setTimeout,setInterval,clearTimeout,clearInterval用法

setTimeout是指过多久执行,只执行一次 setInterval是指每过多久执行一次 clearTimeout是关闭setTimeout定时器 clearInterval是关闭setInterval定时器,不让它一直执行 <html> <head> <title></title> </head> <style> </style> <script> window.onload=function(){ var

javascript中的setInterval()和setTimeout()用法比较

setTimeout()和setInterval() 何时被调用执行 定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔指定的毫秒数循环调用函数或表达式,直到clearInterval把它清除. 从定义上我们可以看到两个函数十分类似,只不过前者执行一次,而后者可以执行多次,两个函数的参数也相同,第一个参数是要执行的code或句柄,第二个是延迟的毫秒

【JavaScript】JavaScript中的Timer是怎么工作的( setTimeout,setInterval)

原文(http://www.yeeyan.org/articles/view/luosheng/24380) 作为入门者来说,了解JavaScript中timer的工作方式是很重要的.通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. var id = setTimeout(fn, delay); - 初始化一个单一的timer,这个timer将会在一定延时后去调用指定的函数.这个函数(setTimeout)将返回一个唯

javascript中setTimeout和setinterval的区别是?

setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束.如果运行的代码中再次运行同样的setTimeout命令,则可循环运行. setinterval是循环运行的,即每到设定时间间隔就触发指定代码.这是真正的定时器. serinterval使用简单,而setTimeout则比较灵活,可以随时推出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒...... setTimeout  定义和用法:  setTimeout()方法用于

JavaScript中SetInterval与setTimeout的用法详解

在写H5游戏时经常需要使用定时刷新页面实现动画效果,比较常用即setTimeout()以及setInterval(),但是大家对SetInterval与setTimeout的用法了解吗,下面通过本文给大家详解js中SetInterval与setTimeout的用法,需要的朋友参考下 setTimeout 描述 setTimeout(code,millisec) setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. 注:调用过程中,可以使用clearTimeout(id_of_

JS中的setTimeout和setInterval的区别

学了许久的javascript,发现其中非常常用的两个函数,就是setInterval和setTimeout函数,对这两个函数的理解,有时觉得很模糊,经过多次的试验,终于对它有了比较深入的了解.定义,setInterval()-- 间隔指定的毫秒数不停地执行指定的代码.setTimeout,延迟两秒调用函数,这个定义非常的简单,但是它并不像字面意思上那么的简 很多人都觉得这两个方法差不多,但是,实际上,他们差的很远呢     因为setTimeout(表达式,延时时间)在执行时,是在载入后延迟指

requireJS中使用setTimeout和setInterval遇到的问题和解决方式

javascript中与定时相关的API有setTimeout()和setInterval(),这2个函数功能不同,但是使用方式是一样的. javascript中下面的写法,相当于是定义了一个密闭空间,在其中定义的变量和函数都是私有,只能本模块内访问. (function(){ var msg = "msg"; })(); //报错 alert(msg); 以前我写javascript,都是使用setTimeout("say('aty');",1000);这种方式,

Javascript定时器(二)——setTimeout与setInterval

一.解释说明 1.概述 setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段 setInterval:周期性地调用一个函数(function)或者执行一段代码. 2.语法 setTimeout: var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); var timeoutID = window.setTimeout(code, delay); timeoutID 是该延时操作的数字ID,