5

我想问是否存在 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

4 回答 4

4

递归”超时模式本身绝对不是危险的(也不是递归的),但只是为了确保像这样使用它:

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 );
于 2011-11-17T10:31:16.540 回答
1

为什么不使用setIntervalandclearInterval来代替?

于 2011-11-17T10:32:09.403 回答
0

setTimeout不是递归调用,它设置了一个内部计时器,该计时器触发一次然后自毁。调用setTimeout在创建计时器后立即结束,因此函数正常退出。因此,您的代码应该可以正常工作。

于 2011-11-17T10:32:16.083 回答
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因为它违反了标准。

于 2011-11-17T11:22:11.067 回答