我想询问是否存在另一个setTimeout / clearTimeout实现来替换这种嵌套结构,避免回送
function timedCount()
{
document.getElementById('txt').value=c;
c=c+1;
t=setTimeout("timedCount()",1000);
}
function stopCount()
{
clearTimeout(t);
timer_is_on=0;
}
我读过太危险了,无法拥有无限的嵌套循环,因为在不确定的时刻,客户端会由于内存不足而崩溃。
我想问一下clearTimeout()
方法会发生什么?它是否清除了内存堆栈?
答案 0 :(得分:4)
"recursive" timeout pattern本身绝对不是危险的(也不是递归的),只是为了确保像这样使用它:
function timedCount()
{
document.getElementById('txt').value=c;
c=c+1;
window.t=setTimeout( timedCount, 1000 );
}
function stopCount()
{
clearTimeout(window.t);
timer_is_on=0;
}
它实际上比setInterval
更安全,因为如果在setInterval
调用中发生错误,它会一直反复进行...
(function updatePage(){
throw new Error( "computer is not turned on" );
setTimeout( updatePage, 1000 );
})()
function updatePageDumb(){
throw new Error( "computer is not turned on" );
}
setInterval( updatePageDumb, 1000 );
答案 1 :(得分:1)
为什么不使用setInterval
和clearInterval
?
答案 2 :(得分:0)
setTimeout
不是递归调用,它设置一个内部计时器,触发一次然后自毁。对setTimeout
的调用在创建定时器后立即结束,因此函数正常退出。因此,您的代码应该可以正常工作。
答案 3 :(得分:0)
一些指示:
1)由于您正在尝试访问dom元素,因此最好检查DOM中是否存在该元素。
由于您已经在使用jQuery,因此建议在其中包含所有这些代码
$(document).ready()
。
2)clearTimeout
在这种情况下从内存中删除引用t
,任何后来对它的引用都将导致不可预测的结果。变量t
实际上用于您想要在某个时刻从元素中清除timeout
。
3)以字符串形式传递值timedCount()
意味着JS必须应用eval来获取其值,在这种情况下,它指的是一个函数。 http://www.jslint.org。 JS标准要求避免使用eval。最好在这里使用匿名函数,然后调用所需的函数timedCount()
。
4)就另一种实现而言,它实际上取决于您希望如何以及何时调用stopCount()
函数。在你的实现中,它实际上永远不会被调用,因为它在1秒后持续调用相同的函数。
所需的代码可能类似于
function timedCount()
{
// the first 2 lines doing something
t = setTimeout(function()
{
// if clear time out logic
if ( can_clear_timeout() )
{
stopCount();
}
else
{
return timedCount();
}
}, 1000);
}
5)另一个警告是不应该使用像timer_is_on
这样的全局变量,因为它违反标准。