我之理解---计时器setTimeout 和clearTimeout

今天在写个图片切换的问题 有动画滞后的问题,才动手去查setTimeout 和clearTimeout。之前写的图片播放器也有类似的问题,有自动start按钮 和stop按钮,

其他都正常,问题出在每次多次快速的点击start按钮时,图片播放的速度会变块很多,而且没有规律。当时也没有去想这个问题,直到今天遇到了类似的问题

才决定去一探究竟。

列举个简单累加例子:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>计时器</title>
</head>
<script type="text/javascript">
  var num=0;
  var i;
  function startCount(){
    document.getElementById(‘count‘).value=num;
    num=num+1;

    i=setTimeout("startCount()",1000);

  }
  function stopCount(){
  clearTimeout(i);
  }
</script>
</head>
<body>
  <form>
    <input type="text" id="count" />
    <input type="button" value="Start" onclick="startCount() "/>
    <input type="button" value="Stop" onclick="stopCount()" />
  </form>
</body>
</html>

效果如下:

点击开始累加。多次点击开始按钮时,数字飙升的很快,取决于你点击的速度。

function startCount(){
      clearTimeout(i);
    document.getElementById(‘count‘).value=num;
    num=num+1;

    i=setTimeout("startCount()",1000);

  }

后来给startCount函数添加个clearTimeout(i);就解决了问题,当时不知其所以然。

今天仔细想了下原来是这么回事。

为什么在没有设置clearTimeout的时候多次点击数字会飙升?

1:当我们点击start按钮后就开始运行函数,先显示数字0,然后就运行到setTimeout,1s后执行一次startCount函数,因为函数内部有setTimeout  所以函数会一直执行下去,

而当我们再次点击start按钮时,这个函数还会再执行一次,之前这个函数已经在执行了。那么这个函数就是交替执行,那么数字就会混乱,累加的速度翻倍了,至于和点击的次数是什么关系,没有过深入的研究,就不得而知了。

2:为什么在我们设置了clearTimeout后就可以避免这种情况的出现?

我们来运行一次函数,点击开始,函数开始运行,当运行到setTtimeout的时候设置了该函数1s后再运行一次,此时有个返回值 i 。在这个指令下达后,我们假设在这个1s的时间内再次点击start按钮会发生什么?(1s的时间还是很久的,我们可以点击N次鼠标),把这个被setTimeout设置执行的函数编号为A,我们再次点击触发执行的函数编号为B;那么B是瞬发的(计算机的速度毋庸置疑),而这个A还得0~1s之后才去执行(B在A先执行),b执行的时候函数内部有clearTimeout,所以就把这个setTimeout设置的A取消了,不用执行了。那么就只有B在执行了,无论怎么点击都不会出现混乱的情况了。

那么问题来了,你设置了clearTimeout 那不就把设置的setTimeout终止掉了吗?那不就不会累加了吗?

说真的当时我也疑惑了,那么来分析分析。函数执行一次,setTimeout设置了1s后再执行函数一次,(没有setTimeout就不运行函数了),指令下达后执行,我们去执行,

当进入到函数内部(也就是函数体)的时候遇到了clearTimeout 他说你们别再执行函数了。可我们已经在执行了,况且我们的指令也就是执行这一次,我们执行完了就不会执行了。此时的clearTimeout对我们这次执行函数没什么影响。(因为我们本来就是只执行这一次,就没有下次别执行的说法),如果把clearTimeout放在函数体外面就不一样了,我可以在外面先把你拦截,在你还没有执行,还没有进入函数内部的时候就拦截你,这样就达到了停止的作用,类似top按钮。

END。我自己也算是理解了。

自己的一些理解,如有不当之出,还望路过的园友不吝指教,助我早日走上正道。

时间: 2024-11-06 10:21:46

我之理解---计时器setTimeout 和clearTimeout的相关文章

关于javascript中setTimeout()和clearTimeout()的疑惑。

由于在w3school中学习javascript时,当学到setTimeout()和clearTimeout()方法时.根据它所提供的例子(下面的代码转自w3cschool)—计数程序,发现当你不停的点击开始计数得到button, 计数将会加快,给我的感觉是同时运行好几个计数方法,但是我所不清楚的是这几个方法是同步执行还是异步执行.此时,如果你想要停止setTimeout()方法,你需点击停止button的次数与你点击开始计数button的次数相同. 我觉着这里怎么同步和异步机制都可以解释.希望

利用setTimeOut 和clearTimeOut 方法控制写一个 滑动导航显示不同信息的效果

效果如图鼠标滑动导航  下边显示不同效果 html代码和css格式代码 <body> <div id="tab" class="tab"> <div class="tab-title" id="tab-title"> <ul> <li class="select" data-flag="0"><a href="#

结合setTimeout和clearTimeout,实现“返回顶部”的功能

结合setTimeout和clearTimeout,当页面停止滚动时,“返回顶部”按钮淡隐淡出.点击“返回顶部”页面以动画形式返回顶部.完美兼容ie6-11,firefox,chrome等. html代码如下: <a href="javascript:void(0)" id="backToTop" class="backToTop">ToTop</a> css代码如下: html {_background: url(abo

setTimeout与clearTimeout ——小小计时器

先看下效果 话不多说上代码~ <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>计时器</title> <script type="text/javascript"> var num=0; var i; f

计时器 setTimeout

import flash.utils.clearTimeout; import flash.utils.setTimeout; // 设置多少毫米触发 private var delay:Number = 1000; // 记录开启的计时器 private var intervalId:uint; /** * 是否添加 时间侦听 * @param _isAdd 默认是 */ public function addTimeOut(_isAdd:Boolean = true){ if (_isAdd

计时器setTimeout()

setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次. 语法: setTimeout(代码,延迟时间); 参数说明: 1. 要调用的函数或要执行的代码串. 2. 延时时间:在执行代码前需等待的时间,以毫秒为单位(1s=1000ms). 当我们打开网页3秒后,在弹出一个提示框,代码如下: <!DOCTYPE HTML> <html> <head> <script type="text/javascript">

settimeout,cleartimeout的使用分析

设置时间的定时轮回执行,大家想到的js也就是settimeout这个方法,这个方法确实能够实现定时反复执行的功能,clearttimeout这是清理或者是暂停轮回执行的情况.可是发现clearttimeout清理不了上次执行的settimeout句柄,到底怎么回事,是clearttimeout方法不好使?带着这个问题,我开始翻阅今天编写的代码,在js中,settimeout方法会返回一个int类型的数据,俗成为定时器编号或者ID,这个编号能够标识改定时器的唯一性,clearttimeout则用该

setTimeout、clearTimeout、setInterval

setTimeout(cb, ms) setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb).:setTimeout() 只执行一次指定函数. 返回一个代表定时器的句柄值. 实例 创建文件 main.js ,代码如下所示: function printHello(){ console.log("Hello, World!");}// 两秒后执行以上函数 setTimeout(printHello,2000); 执行 main.js 文件,代码如下所示

setTimeout()与clearTimeout()

setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. clearTimeout() 方法可取消由 setTimeout() 方法设置的 timeout. <input type ='text' id ='aaa' > <input type ='button' value ='stop' id ='bb' onclick = 'bb()'> <script> var iTime;  function aa(){         aaa.value +