var c=0
var t
function timedCount()
{
document.getElementById('txt').value=c
c=c+1
t=setTimeout("timedCount()",1000)
}
<input type="button" value="开始计时!" onClick="timedCount()">如上的代码,如果你点了两次计时按钮的话,就变成,相当于两个计时器了,c增大的速度就变快了。但是,不是操作的同一个变量么?
为什么计时器会是这样???

解决方案 »

  1.   

    但是你没有把之前的cleatTimeout掉,那照你这么说,操作同一个变量,那还要clearTimeout方法做咩?
      

  2.   

    js中,除了基本数据类型的赋值,其它类型赋值都是地址传递,也就是你第一次调用setTimeout(),将该地址赋值给t,第二次再调用时,又产生一个计数器,这时这个计数器的地址覆盖了t,其实是有两个setTimeout在运行,你可以在页面上再加一个按钮用来清除<input id="txt" type="button" value="clear" onClick="clear()"></body>
    function clear(){
    cleatTimeout(t);
    }
    这样你点击两次“开始计时”,在点击一次“clear”,页面上的计数器仍在运行,试试吧
      

  3.   

    启动了多个计时器了,启动新计时器时要先中断上一个计时器,这种逻辑用Timeout不好,还是用Interval吧。var c=0,timer;function timedCount()
    {
    clearInterval(timer);//终止上一个计时器
    timer=setInterval("timedCount1()",1000)
    };function timedCount1(){
    document.getElementById('txt').value=c;
    c=c+1;
    }
      

  4.   


    上面添加的js代码写错了,应该是function clear111(){
        clearTimeout(t);
    }还有添加清除按钮的那行,改成<input id="txt" type="button" value="clear" onClick="clear111()"></body>,这样是js中应该注意的,value和onclick里面的值别写成一样的,要不有的浏览器不能正确解析
      

  5.   

    var c=0
    var t
    function timedCount(clicked)
    {
    document.getElementById('txt').value=c
    c=c+1
    if(!clicked){
     return;/*你clear也行,看你自己的需要*/
    }

    t=setTimeout("timedCount()",1000)
    }
    <input type="button" value="开始计时!" onClick="timedCount(1)">click的时候多传个参数过去
      

  6.   


    var c=0
    var t
    function timedCount(clicked)
    {
    if(clicked){
     return;/*你clear也行,看你自己的需要*/
    }

    document.getElementById('txt').value=c
    c=c+1
    t=setTimeout("timedCount()",1000)
    }
    <input type="button" value="开始计时!" onClick="timedCount(1)">写错个地方,放错位置了。
      

  7.   

    各位大虾,,重点不是解决之道。。
    唔。。比方说像carlisliu说的那样:js中,除了基本数据类型的赋值,其它类型赋值都是地址传递
    很好,是赋值传递。按这个逻辑:
    1.第一次点击计时器按钮。t是第一个计时器的地址。
    2.第二次点击计时器按钮。t已经是第二个计时器的地址了。
    3.第一次点击清除按钮。清除了第二个计时器。
    4.第二次点击清除按钮。为什么,为什么还能清除掉第一个计时器??调试器里面查看,这个t的值是两个计时器执行的次数的总和。所以,个人感觉哈,计时器,不像是简单的一个地址,更像是一个队列,里面可以有多个做不同事情的计时,先进后出,清除的时候是后加进去的计时。不过无奈,调试也只能看到一个数值,执行次数总和的数值。其实,我是想问这个。。
      

  8.   

    为什么会出现这种问题呢,我来解释一下.
    var c=0//全局变量
    var t
    function timedCount()
    {
    document.getElementById('txt').value=c
    c=c+1
    t=setTimeout("timedCount()",1000)
    }1.你的c是全局变量,不管执行多少次timedCount,修改的都是同一个c.
    2.你的setTimeout("timedCount()",1000),是一自我直循环调用timedCount,永不停止,每次执行都产生一个新的timedCount事件插入javascript的执行线程的执行队列,此时队列里只有一个setTimeout的事件,只是每次这个执行完都再产生一个新的插入队列.
    3.如果你点击n次按钮,那么timedCount()执行n次,也就产生了n个setTimeout事件,也就是javascript的执行队列里面有了n个setTimeout事件
    4.同时存在n个执行事件修改c,那么c的增加速度自然是n倍的速度了
      

  9.   

    setTimeout() 方法的返回值是一个唯一的整数数值,
    这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTimeout() 方法来终止,而使用这个方法的时候,系统必须知道你到底要终止的是哪一个 setTimeout() 方法 (因为你可能同时调用了好几个 setTimeout() 方法),这样 clearTimeout() 方法就需要一个参数,这个参数就是 setTimeout() 方法的返回值 (数值),用这个数值来唯一确定结束哪一个 setTimeout() 方法。
      

  10.   

    每次timedCount() 后就是一个新的执行
    我觉得 你连代码在做什么都不知道
    想的太多了
      

  11.   

    谢谢11,12楼。嗯,是的,是这么回事。是一个加入队列的过程,然后清除的时候是根据最近是哪个setTimeout的返回值来决定清除哪一个的。还有,To,13楼:
    每次timedCount() 后就是一个新的执行
        -->废话,白痴都看的出来。
    我觉得 你连代码在做什么都不知道
        -->我承认,我是没完全理解内部过程,但是谈不上不知道。
    想的太多了
        -->想不想的多是我的事,不想的多怎么能想得透呢?谁没有逻辑犯转的时候?切!~