setTimeout / clearTimeout是危险的吗?

时间:2011-11-17 10:21:37

标签: javascript loops nested settimeout infinite

我想询问是否存在另一个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()方法会发生什么?它是否清除了内存堆栈?

4 个答案:

答案 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)

为什么不使用setIntervalclearInterval

答案 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这样的全局变量,因为它违反标准。