0

javascript の setTimer メソッドの背後にあるロジックを理解するのに苦労しています。

 <html><head>
    <script>
        function Timer () {
        var today = new Date();
        var h = today.getHours();
        var m = today.getMinutes();
        var s = today.getSeconds();

    document.getElementById('show').innerHTML=h+":"+m+":"+s;
        t = setTimeout("Timer()", 1000); 
      }
</script>
</head>

<body onload="Timer()">
<div id="show"></div>
</body></html>

setTimeout は、関数/メソッドの実行を遅らせるために使用されます。では、なぜリアルタイムクロックで使用されているのでしょうか?

t = setTimeout("Timer()", 1000);

この部分は紛らわしいです。

4

4 に答える 4

2

時計は、経過時間後に再帰的に自分自身を呼び出しています。

JS でリアルタイムクロックを作ることは不可能です。JS エンジンがどのように機能するかによりTimer、無限の期間実行するためにループに入れた場合、画面に時間の更新が表示されることはありません (変更は関数が終了して終了するまでウィンドウに描画されないため)。プログラムのギャップ)。また、その無限ループ内では、JS は一度に 1 つのことしか実行できないため、ページで他のことを行うことはできません (ページを閉じることもできません)。このループで完了.......

それがそのためのものsetTimeoutです。

Timer時計として機能する機能です。関数の内部では、Timerすべての作業が完了すると、setTimeout1 秒 (1000 ミリ秒) 待ってから という関数を呼び出すように指示されていますTimer

Timerたまたま同じ機能です。でもsetTimeout、それはわからないし、気にしない。

このt場合の はほとんど役に立ちません。 setTimeout診療所で番号を取るのと同じように、番号を返します。やり直す前に取り消すことにした場合は、呼び出すことができ、clearTimeout(t);その呼び出しをスキップします (この場合、クロックの呼び出しを停止します)。

ここにはいくつかの悪い慣行がありますが、それらについて言及する必要があるので、自分の実践でそれらを真似しないようにしてください。

最初:setTimeout文字列ではなく、関数への参照を渡します...

var runThisFunction = function () { console.log("It's the future!"); },
    time_to_wait = 250;

// DON'T DO THIS
setTimeout( "runThisFunction()", 250 );


 // DO THIS
 setTimeout( runThisFunction, 250 );

違いは、setTimeoutその文字列が を通過するevalことです。これは、何をしようとしているのかによっては、セキュリティ上の大きな問題になる可能性があります。

2 番目の問題は、ランダムなグローバル変数の設定tです... ...そして、それを解決策として使用したいと考えています。まず、数年以内に、JS エンジンは、そのようなことをしている人々に対して怒鳴り始めるでしょう。2 つ目は、そのページのアプリの任意の部分が を上書きtしたり、スクリプトの別の場所に依存している可能性があるため、これは大きな穴tです。ただし、1000 ミリ秒ごとに新しい番号で上書きされます。

代わりに、おそらくTimer.start();and Timer.stop();setup を使用する必要がありました。

于 2012-09-16T08:01:31.163 に答える
2

あなたのコード:

t = setTimeout("Timer()", 1000); 

最初に知っておくべきことは、最初のパラメーターを文字列に入れることは悪い習慣と見なされているということです。次のように、引用符を付けず、括弧を付けずに関数名にする必要があります。

t = setTimeout(Timer, 1000); 

それはさておき、時計を表示するために使用されている理由についての質問:

setTimeout()関数内で を使用しTimer()てそれ自体を呼び出すことは、関数を繰り返し呼び出すための一般的な Javascript パターンです。setTimeout()それ自体は、指定された時間が経過した後、関数が呼び出されるのを 1 回だけトリガーするため、繰り返しイベントの場合は毎回再トリガーする必要があります。

setTimeout呼び出しは関数内にあるため、他の方法で初めて呼び出されるTimer()まで設定されません。Timer()ここで のbody onload出番です。

ご想像のとおりsetTimeout()、関数が正確に指定された時間後に呼び出されることを保証するための正確な方法ではありません。Javascript はマルチスレッド化されていないため、トリガーされたイベント ハンドラーは、同時に実行されている他のコードを待機する必要があります。他の何かがゆっくりと実行されている場合、タイマーが必要なタイミングでトリガーされない可能性があります。

setTimeoutただし、これは実際には clock の問題ではありません。クロックは、ループに依存して同期を維持するのではなく、実際のシステム時間に設定されるためです。setTimeoutループは、表示が (およそ) 1 秒に 1 回更新されるようにするために使用されているだけです。実際には正確に 1 秒に 1 回でなくても、問題はありません。

それが物事をもう少しよく説明するのに役立つことを願っています.

于 2012-09-16T07:44:52.370 に答える
0

Timer()関数が呼び出されると、1 秒後に再度実行されるようにスケジュールされます。最終結果は 1 秒に 1 回で、現在の時刻で要素をTimer()更新します。(がページ上の他のコードで使用されていない限り、showなぜ に割り当てられているのかわかりません。)tt

于 2012-09-16T07:22:29.590 に答える
0

ラインは 1 秒後に関数を再開します。

于 2012-09-16T07:23:16.453 に答える