Sorry,我再说一下,就算加了clearTimeout也会leak...-_-~如下:<html>
    <head>
        <script type="text/javascript">
            function test()
            {
                document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1;
                window.clearTimeout(window.setTimeout(test,10)-1);
            };
        </script>
    </head>
    <body onload="test()">
        <input type="text" id="txt1" value="0" />
    </body>
</html>

解决方案 »

  1.   

    调用setTimeout()时,它创建了一个数字ID,与操作系统中的进程ID相似吧。可以
    <html>
        <head>
            <script type="text/javascript">
                function test()
                {
                    document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1;
                 var iTimeoutID= window.setTimeout(test,10);
                 clearTimeout(iTimeoutID);
                };
            </script>
        </head>
        <body onload="test()">
            <input type="text" id="txt1" value="0" />
        </body>
    </html>
    ------------------------
    setInterval 和setTimeout()相似
      

  2.   

    用FF吧,FF智能会阻止死循环的。
      

  3.   


    恩,我在FF测是没有泄漏的,但我的程序肯定要在IE上也要跑啊^_^
      

  4.   

    楼主用的ie 是几的阿
    我在ie7里看没有那么严重阿
      

  5.   

    多试几个IE版本。。估计只有少数几个版本的 IE出现这个问题。
      

  6.   

    试试这样:
    <html>
        <head>
            <script type="text/javascript">
                function test(_obj)
                {
                    var iV = parseInt(_obj.value);
                    _obj.value = iV+1;
                    window.setTimeout(function(_obj2){return function(){test(_obj2)}}(_obj),10);
                    _obj = null;
                };
            </script>
        </head>
        <body onload="test(document.getElementById('txt1'))">
            <input type="text" id="txt1" value="0" />
        </body>
    </html>
      

  7.   

    前端时间整理的类似的问题,参考下这里:
    http://www.v-ec.com/dh20156/article.asp?id=139#comm_32
      

  8.   

    我在IE5.5、IE6和IE7上都测了,确实会增长,只是不是太明显,
    把IE开起,隔较一段时间才能看到增了4K,在Opera上测试的效果是,可以很明显地看到内存增长一段时间后又会减少回来,貌似是过段时间才被回收的。我在自己的机器(384M内存、C2 1.0GHZ/windows 2003 server + IE6)上测的效果就相当明显,看着内存在不断增加-_-~而FF则没有这样的问题。
      

  9.   

    执行一次clearTimeout一次!
    这样不会出现死循环
      

  10.   


    <div id="cont">0</div>
    <script type="text/javascript">
    var obj = document.getElementById("cont");
    function run(){
        var v = parseInt(obj.innerHTML) + 1;
        obj.innerHTML = v;
        v = null;
        setTimeout(run, 10);
    }
    run();
    </script>测试环境:win2003+ie6/ff2
    ff和ie6同时运行也未见lz所说的不断增长的问题。
    我觉得不是setTimeout的问题,而是getElementById每次都重新获取的问题。
      

  11.   

    另外有个问题。下面的函数:
    function test()
    {
         document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1;
         var iTimeoutID = window.setTimeout(test,10);  //<---A
         clearTimeout(iTimeoutID);   //<---B
    };
    B语句会执行吗?想不通。
    即使a语句延迟执行能跳到b,但b已经clear了,a会执行吗?
    很矛盾。
      

  12.   

    我的IE8怎么看不到长?
    window.clearTimeout(window.setTimeout(test,10)-1);
    你这里-1是做何解释?那clearTimeout岂不是白跑?把-1去掉就可以k掉记时器了
    石头君发的那个关于循环引用的泄露和这个貌似不是一个问题...- -
    貌似没看出这个有泄露....
      

  13.   

    firefox.exe muxrwc 00 35,224k 左右ie 也是 没有出现狂涨
    测的是1L的代码..- -没发现问题,飘走...
      

  14.   


    这段也会泄漏,把程序开起,不要最小化IE,等1分钟后记下当前内存占有量,1个小时之后再看内存占有量,就会看到效果了。。我在 2G内存+1.60GHZ CPU / windows XP SP2+IE7 上测,平均每分钟增加0.56K
      

  15.   

    function test() 
    { var iTimeoutID;
    if(iTimeoutID){clearTimeout(iTimeoutID);}
        document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1; 
        iTimeoutID = window.setTimeout(test,10);  // <---A 
           

    test()这样执行一次清除一次根本不会涨
      

  16.   


    这个只会执行一次,
    因为setTimeout语句会最后进栈,
    也就是说,先会执行clearTimeout(iTimeoutID);
    所以无法继续跑了
      

  17.   


    window.clearTimeout(window.setTimeout(test,10)-1); 这个相当于var id=0
    function test()
    {
      window.clearTimeout(id);
      id=window.setTimeout(test,10);
    }因为setTimeout会每次返回一个递增1的整型数值,以标识当前是哪一个“线程”,
    这个数值从浏览器一打开就会初始化。这样用就是每次clear掉当前setTimeout的上一次调用,简写而已^_^
      

  18.   

    这样不就行了?
    <html>
        <head>
            <script type="text/javascript">
                function test()
                {
                    document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1;
                };
            </script>
        </head>
        <body onload="window.setInterval(test,10);">
            <input type="text" id="txt1" value="0" />
        </body>
    </html>
    为啥一定要反复调用setInterval呢?
      

  19.   


    setInterval的情况也是一样的。。