11

このコードスニペットがアプリケーションで見つかりました。最初の行が不要かどうか疑問に思っています-変数がすぐに上書きされる場合、変数に対してclearTimeoutを呼び出す必要がありますか?それとも私が知っておくべきいくつかの条件がありますか?

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(function () { countdownHandler() }, MILLISECONDS);
}

私の勘は「はい、clearTimeoutを呼び出す必要があります」です。タイムアウト変数をnullに設定するだけでOKの場合、clearTimeoutメソッドが存在する理由がわからないためです。

より良い質問は次のとおりだと思います。

var timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);
timeoutHandler = setTimeout(countdownHandler, MILLISECONDS);

現在、約MILLISECONDSで起動を待機している関数が2つありますか、それとも1つだけですか?

4

4 に答える 4

18

setTimeoutを呼び出すと、それを識別するための整数が返されるため、クリアするときに参照できます。したがって、変数を上書きしてもタイムアウトはクリアされず、IDへの参照が上書きされるだけです。参照を上書きすると、以前の参照をクリアできなくなります:-(

ニコが言うように、clearTimeoutを使用して、コールバックの起動を停止します。

図:

var t = setTimeout(ch, 1000, "first timeout");
t = setTimeout(ch, 1500, "second timeout");
clearTimeout(t); // this will only clear the second timeout
t = setTimeout(ch, 2000, "third timeout");
function ch(s){
  console.log(s);
}

これがお役に立てば幸いです。

于 2012-04-11T16:35:47.650 に答える
6

いいえ、実際にクリアする必要がある場合にのみ呼び出す必要があります。

これがその変数を使用する唯一のコードである場合、必要はありません。


参考までに、コードを少し短くできるようです...

function Countdown() {
    clearTimeout(sessionTimeoutHandle);
    sessionTimeoutHandle = setTimeout(countdownHandler, MILLISECONDS);
}

匿名関数では何も得られませんでした。

于 2012-04-11T16:04:16.793 に答える
4

clearTimeoutメソッドが存在する理由が考えられません

clearTimeout既存のタイマーをキャンセルするため、つまりタイマーを消去してそのコールバック関数が呼び出されないようにするために存在します。

于 2012-04-11T16:07:28.457 に答える
1

clearTimeoutは、タイムアウトをキャンセルするためのものであり、メモリなどを解放するためのものではありません。タイマーを停止する場合は、clearTimeoutを呼び出します。タイマーを終了する場合、またはすでに終了している場合は、停止する必要はありません。

于 2012-04-11T16:04:06.447 に答える