【面向JS--定时器】

定时器分为 周期性定时器 和 一次性定时器

周期性定时器: 让程序每隔一段时间间隔,反复执行一项任务

如何使用: 3步:

1、声明任务函数: 定时器每次执行的任务
    function task(){...}
    任务函数通常要自己考虑:何时停止定时器的临界值

2、将任务函数放入定时器,定时执行:
    timer=setInterval(task,interval)
    其中: interval 是间隔的毫秒数
         timer往往是一个全局变量: 用来保存当前定时器的序号
         序号是内存中唯一标识一项任务的编号
    原理:首先将task函数对象和interval时间间隔记录在定时器对象中,再返回当前任务的序号
    然后,定时器会按照指定时间间隔,将task函数定时加入回调队列(callback queue)中。
    只有ECS中没有正在执行的函数时,才将callbackqueue中的函数加入ECS中执行
3、停止定时器:
    clearInterval(timer);//根据序号关闭定时器

一次性定时器: 先等待一段时间,再自动执行一次任务

如何使用: 3步:

1、声明任务函数: 
    function task(){...}
2、启动一次性定时器
    timer=setTimeout(task,wait)
    其中: wait是等待的毫秒数
3、停止一次性定时器: 其实是停止等待,不再执行任务
    clearTimeout(timer);
    timer=null;

其实: 一次性定时器连续启动,也可实现周期性的效果
区别: 任务函数的结尾: 
     周期性定时器任务: 判断何时停止定时器
     一次性定时器任务: 判断何时启动定时器
<!DOCTYPE html>
<html>
 <head>
  <title>倒计时</title>
  <meta charset="utf-8"/>
 </head>

 <body>
    <h1>元旦倒计时:<span id="time"></span></h1>
    <button id="btn">||</button>
<script>
    var span=document.getElementById("time");
    function task(){
        var now=new Date();
        var Y = now.getFullYear()+1;
        var target=new Date(Y+"/01/01");
        var s=parseInt((target-now)/1000);
        if(s>0){//有一秒延迟
            var days=parseInt((s/3600/24));
            var hs=parseInt(s/3600%24);
            var ms=parseInt(s/60%60);
            var ss=s%60;
            span.innerHTML=`${days}天${hs}小时${ms}分${ss}秒`;
        }else{
            clearIntserval(timer);
            span.innerHTML=`元旦快乐`;
        }
    }
    var timer=setInterval(task,1000);//("task();",1000);
    var btn=document.getElementById("btn");
    btn.onclick=function(){
        if(this.innerHTML=="||"){
            clearInterval(timer);
            this.innerHTML="|>";
        }else{
            timer=setInterval(task,1000);
            this.innerHTML="||";
        }
    }
</script>
 </body>
</html>

注意:无论是 setInterval 还是 setTimeout,在函数的执行队列里,永远在最后执行,哪怕他写在前面

function test(){
    setTimeout(function(){console.log("timeout")},0);
    for(var i=0;i<5;i++){
        setTimeout(function(){console.log(i)},1000);
    }
}
test();
//5
//5
//5
//5
//5
//timeout
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值