JS - 定时器

前言:在引用开发中,我们经常需要在页面中执行一些周期性的操作,比如每隔一段时间就执行某一固定的操作。而对于这样的操作,最简单和最高效的实现的方式就是使用setInterval和setTimeout两种方式了。接下来我们就来详细了解一下这两种不同的定时器吧!

setInterval

俗称:间歇性定时器;功能创建一个定时器,可按照指定的周期(以毫秒计)来调用函数或计算表达式;setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数;注意这种定时器只要创建了就等于启动。

语法: setInterval(函数名,时间)
功能: 每隔参数2的时间内,就调用一次参数1的函数。注意:时间以毫秒来计算的!

如果要关闭setInterval设置的定时器,首先就要获取setInterval返回的ID值,然后通过clearInterval(返回的ID值)来关闭特定的setInterval设置的定时器。

实例:

var timer = window.setInterval(func,5000);
function func(){
        console.log("Hello World");
    }

这里就创建了一个每隔5000毫秒就执行函数名为func的定时器,在函数中执行打印“Hello World”。当然,上面也可以换成为这样来写:

var timer = window.clearInterval(function(){
      console.log("Hello World");
},5000);

两者的功能是一毛一样的,只不过后面的是匿名函数而已!

如果要清除上面的定时器该肿么办呢?我们可以这样来做。

clearInterval(timer);

这里就通过创建定时器时存储在timer中的ID值,进行销毁特定ID的定时器。

关于返回的ID值,我们该怎么看呢?这就相当于在创建一个定时器的同时,我们也赋予了这个定时器一个特定的身份了,就像我们伟大的祖国给予每个人特定的身份证一样,是独一无二的,也代表了我们每个人也是独一无二的,在这个世界就只有一个你这样。你的名字!!!
下面我们利用下面的代码一起来看看定时器的身份证到底是什么鬼!咳咳

<div id="div1" style="position: absolute;left: 20px;top: 20px;width: 50px;height: 50px;background-color: red"></div>
    <script type="text/javascript">
        var timer;
        var div1 = document.getElementById("div1");
        div1.onclick = function(){
            timer = setInterval(function(){
                console.log(timer);
            },1000);
        }
    </script>

这里通过JS获取到id为“div1”的div,给其增加点击事件后,只要点击div后,就会打印当前定时器的id。下面就是div的样式和不断的点击之后打印的结果。

timerId.PNG

打印结果可以看出,当我们不断的点击div后,timer的值也在不断的改变,说明了定时器在不断的制造出来,以至于在一定时间内打印的次数在不断的增加,timer的值也被不断新建的定时器赋值。也说明了timer就是定时器的返回值。

当然,我们在实际中遇到的问题远不止如此简单,这就需要我们开动我们灵活的大脑了,誓要将定时器玩弄于手掌之中!成大事者,人也。


setTimeout

相比于上面的间歇式定时器,此种定时器俗称延时定时器,也就是用于在指定的毫秒数后调用函数或计算表达式。就相当于设置了一个定时炸弹,在你设定的特定时间之后,它就会被激活,自行爆炸,爆炸之后它也不会再次爆炸!setTimeout定时器也是这样,其只执行一次。如果要多次调用,请使用 setInterval() 或者自身再次调用 setTimeout()。

** 语法:**setTimeout(函数名,时间);
功能:参数2时间后调用参数1函数
返回值:也是返回定时器的id,可以通过该id关闭定时器

如果要关闭setTimeout设置的定时器,方法原理同setInterval类似,不同的也就是方法名的不同。用的是clearTimeout(参数),后面的参数也就是setTimeout要返回的id值。

实例:

<button onclick="closeTimeout()">关闭延时定时器</button>
    <script type="text/javascript">
        var timer = window.setTimeout(func,5000);
        function func(){
            console.log("Hello World");
        }
        function closeTimeout(){
            window.clearTimeout(timer);   // 关闭延时定时器
        }
    </script>

这里设置了5秒后就会只打印一次的延时定时器,然后给按钮增加了清除定时器的方法,一旦按下button,延时定时器就会被销毁了;不过,需要注意的是如果你在延时定时器销毁之后点击是没有任何效果的,因为延时定时器执行了一次之后它就自动销毁了!(对着setInterval说:看看人家多自觉! setInterval弱弱地说:可是它功能没我强大啊!我默默不说话。。。)

不点击按钮5秒后的结果.png
5秒之前点击清除定时器后的效果.PNG

其实,在现阶段的开发阶段,setInterval用的还是比setTimeout频繁的。因为每隔一段时间就执行相同的动作,也就是重复相同的动作,在我们的现实生活中还是常常遇见的。


最后简单谈谈定时器的回调:



其1:定时器的回调函数并不是相当于在时间到了就执行,而是有一个主js执行进程,这个进程是页面刚加载的时候页面按照加载顺序执行的js代码,此外还有一个需要在进程空闲的时候执行的代码队列,而我们所说的定时器的回调就是相当于setInterval在特定时间之后把定时器回调放入到空闲队列中(注意,空闲队列有可能还有其它的代码,比如点击事件,因此定时器回调放入的位置不一定是空闲队列的开始位置!)

其2:setInterval有个很烦的地方就是当js主程序空闲时候,执行代码队列里面的代码的时候,如果此时候我们有一个问题,定时器是等到回调执行完,才开始计时进行下次循环呢?还是只要一次计时完毕,插入回调之后不管回调执不执行就开始计时呢?答案显然是后者,这也就是我说setInterval坑比的原因啊,因为这会出现一种情况,当我们插入回调的时候前队列有别的代码在执行,这时候回调肯定是不会执行的,因此如果这个时候限定时间到了会再次插入回调,这个时候如果发现队列中的第一次回调没有执行,那么再次插入的回调浏览器就默认取消(这是以防出现回调连续执行多次的情况)但是这又引发了新的情况就是有些回调是不能取消掉的?

课后练习:

例一:

setTimeout(function(){
      console.log("小马“);
      setTimeout(function(){arguments.callee;},1000);
},1000)

例二:

setInterval(function(){console.log("小马“);},1000);

问一与二的区别?


 var i=0;
function a(){
        t=setTimeout(function(){console.log("小明")},0);
 }
a();
alert(”小红“);

问先显示小明呢?还是小红??还是小强呢???

总结:setInterval和setTimeout是两种功能完全不一样的定时器,只要运用得当,就可以让它完成某些一次性操作或每隔一段时间就执行的操作吧!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 1、 单线程、任务队列的概念 单线程: JavaScript是一个单线程语言,浏览器只会分配一个javascrip...
    海山城阅读 1,022评论 0 1
  • 在谈js定时器以前,我觉得有必要了解下javascript的事件运行机制,简称(javascript event ...
    JohnsonChe阅读 891评论 0 2
  • 从JS执行机制说起 浏览器(或者说JS引擎)执行JS的机制是基于事件循环。 由于JS是单线程,所以同一时间只能执行...
    love2013阅读 859评论 0 1
  • 去年九月张总劝我改行,今年五月付诸行动开始投简历……上周看到一家心仪很久的小公司发了招聘,刚刚投了一份。心情很复杂...
    不正常生物研究中心阅读 141评论 0 14
  • 第1章 再傻也懂了 电梯缓缓的上升,一想到半个月没见的邵正飞,夏筱筱的心里充满了期待和甜蜜!他说有好事要告诉她,今...
    AA樱桃小说阅读 581评论 0 0