javascript定时功能详解

javascript定时功能详解

1.1概述
        javascript的内置setInterval()与setTimeout()函数提供了定时的功能,前者是每隔几秒执行一次,后者是延迟一段时间执行一次。此外,javascript内置的clearInterval()函数用于取消定时器功能。
1.2 setInterval()函数
定义:
       setInterval()函数可按照指定的周期(以毫秒计)来调用函数或计算表达式,使用 clearInterval()函数可以取消该周期性的方法调用。
语法:
        var intervalID = window.setInterval(func, delay[, param1, param2, ...]);
        var intervalID = window.setInterval(code, delay);
参数详解:
intervalID —— 此重复操作的唯一辨识符,可以作为参数传给clearInterval()。
Func —— 重复调用的函数。 
code —— 重复执行的一段字符串构成的代码(使用该语法是不推荐的,不推荐的原因和eval()一样)。
delay —— 每次延迟的毫秒数。
注意:IE浏览器不支持第一种语法中向延迟函数传递额外参数的功能。
实例:
var fn=function(){
    alert("fn()函数被执行了");
} 
setInterval(fn,1000);//每隔1min弹窗一次

注意:第一次执行后如果不关闭弹窗,则下一秒不会再执行该函数。出现这种现象的原因是javascript 是一个单线程环境,被阻塞了。
1.3 setTimeout()函数
定义:
        setTimeout()在指定的延迟时间之后调用一个函数或者执行一个代码片段,使用clearTimeout()函数可取消由 setTimeout() 方法设置的延迟调用。
语法:
        var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
        var timeoutID = window.setTimeout(code, delay);
参数详解:
timeoutID —— 该延时操作的数字ID,可作为参数传给clearTimeout()。
func —— delay毫秒之后执行的函数。
code —— delay毫秒之后执行的代码 (使用该语法是不推荐的, 不推荐的原因和eval()一样)。
delay —— 延迟的毫秒数。
注意:IE浏览器不支持第一种语法中向延迟函数传递额外参数的功能。
实例一:
setTimeout(function() {
console.log(1);
}, 1000); //延迟1min后打印1
或setTimeout("console.log(1);", 1000); //不推荐使用的语法

实例二:
setTimeout(function() {
console.log(1);
}, 0);
console.log(2);
//执行结果是:先输出2,再输出1。

注意:出现这样现象的原因是:当事件队列为空的时候,才会执行SetTimeout()里面的代码。
1.3 clearInterval()函数
语法:
        window.clearInterval(intervalID); // intervalID是setInerval()的返回值,是此setInerval()函数的唯一标识。
注意:用 clearInterval(Method);来清除,往往不能马上停止。
实例一:
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>实例</title>
</head>
<body>
<div id="clock"></div>
<button id="btn"></button>
<script>
    function Clock(clockDiv){
        this.clockDiv=clockDiv;
        this.getCurrentDate=function(){
            var currDate=new Date();
            var currDateTime=currDate.getFullYear()+"-"+(currDate.getMonth()+1)+"-"+currDate.getDate()+" "+currDate.getHours()+":"+currDate.getMinutes()+":"+currDate.getSeconds();
            this.clockDiv.innerHTML=currDateTime;
        }
    }
    var clockDiv=document.getElementById("clock");
    var clickObj=new Clock(clockDiv);
    var intervalId=window.setInterval(function () {
            clickObj.getCurrentDate();
    },1000);
    document.getElementById("btn").onclick=function(){
        window.clearInterval(intervalId);
    }
</script>
</body>
</html>

实例二:
//定义计算器全局变量
var pageTimer = {} ; 
//赋值模拟
pageTimer["timer1"] = setInterval(function(){},2000);
pageTimer["timer2"] = setInterval(function(){},2000);
//全部清除方法
for(var each in pageTimer){
    clearInterval(pageTimer[each]);
}
//暴力清除
for(var i = 1; i < 1000; i++) {
    clearInterval(i);
}

分析:实际上暴力清除的方式是不可取的,在不得已情况下才使用,在IE下,定时器返回值在IE下面是8位数字如:248147094,并且起始值不能确定,而Chrome和firefox下是从1开始的个位数字,一般项目还是建议第一种,并且第一种的扩展性也好。
1.5 clearTimeout()函数
语法:
        window.clearTimeout(settimeoutID); //settimeID是setTimeout()的返回值,是此setTimeout ()函数的唯一标识。
1.4使用setTimeout()函数优化setInterval()函数的方案
        一般不用setInterval()函数,而用setTimeout()函数的延时递归来代替setInterval()函数。setInterval()函数会产生回调堆积,特别是时间很短的时候。
优化方案一:
var timeout = false; //启动及关闭按钮  
function time() {
    if(timeout) return;
    console.log(1);
    setTimeout(time,1000);
}
time();

优化方案二:
var fn=function(){
console.log(1);
setTimeout(fn, 1000)
}
fn();

猜你喜欢

转载自wsj123.iteye.com/blog/2394276