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;
}

setIntervalcall でエラーが発生した場合、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

代わりにsetIntervalandを使用しないのはなぜですか?clearInterval

于 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) もう 1 つの警告はtimer_is_on、標準に反するようなグローバル変数を使用しないことです。

于 2011-11-17T11:22:11.067 に答える