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>
<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>
<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()相似
恩,我在FF测是没有泄漏的,但我的程序肯定要在IE上也要跑啊^_^
我在ie7里看没有那么严重阿
<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>
http://www.v-ec.com/dh20156/article.asp?id=139#comm_32
把IE开起,隔较一段时间才能看到增了4K,在Opera上测试的效果是,可以很明显地看到内存增长一段时间后又会减少回来,貌似是过段时间才被回收的。我在自己的机器(384M内存、C2 1.0GHZ/windows 2003 server + IE6)上测的效果就相当明显,看着内存在不断增加-_-~而FF则没有这样的问题。
这样不会出现死循环
<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每次都重新获取的问题。
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会执行吗?
很矛盾。
window.clearTimeout(window.setTimeout(test,10)-1);
你这里-1是做何解释?那clearTimeout岂不是白跑?把-1去掉就可以k掉记时器了
石头君发的那个关于循环引用的泄露和这个貌似不是一个问题...- -
貌似没看出这个有泄露....
测的是1L的代码..- -没发现问题,飘走...
这段也会泄漏,把程序开起,不要最小化IE,等1分钟后记下当前内存占有量,1个小时之后再看内存占有量,就会看到效果了。。我在 2G内存+1.60GHZ CPU / windows XP SP2+IE7 上测,平均每分钟增加0.56K
{ var iTimeoutID;
if(iTimeoutID){clearTimeout(iTimeoutID);}
document.getElementById("txt1").value=parseInt(document.getElementById("txt1").value)+1;
iTimeoutID = window.setTimeout(test,10); // <---A
}
test()这样执行一次清除一次根本不会涨
这个只会执行一次,
因为setTimeout语句会最后进栈,
也就是说,先会执行clearTimeout(iTimeoutID);
所以无法继续跑了
window.clearTimeout(window.setTimeout(test,10)-1); 这个相当于var id=0
function test()
{
window.clearTimeout(id);
id=window.setTimeout(test,10);
}因为setTimeout会每次返回一个递增1的整型数值,以标识当前是哪一个“线程”,
这个数值从浏览器一打开就会初始化。这样用就是每次clear掉当前setTimeout的上一次调用,简写而已^_^
<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呢?
setInterval的情况也是一样的。。