26

setInterval()

関数を呼び出すか、コード スニペットを繰り返し実行します。その関数を呼び出すたびに一定の時間遅延があります。

その間()

テスト条件が true と評価される限り、指定されたステートメントを実行するループを作成します。条件は、ステートメントを実行する前に評価されます。

while(true)特定のステートメントを実行するために使用すると、ブラウザーがクラッシュする ( Firefox )、遅れる ( Opera )、またはステートメントが実行されない ( Chrome ) のいずれかですが、 0 秒setInterval()の固定時間で使用すると、すべてが完全に機能します。わずか0秒であり、論理的に0秒より速くなることはできませんが、なぜこれが起こるのですか?while(true)

while()例:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            while (true)
            {
                document.getElementById("counter").innerHTML += i++; 
            }
        </script>
    </body>
</html>

setInterval()例:

<!DOCTYPE html>
<html>
    <body>
        <div id="counter"></div>
        <script>
            var i = 0;
            setInterval(function() { counter() }, 0);
            function counter()
            {
               document.getElementById("counter").innerHTML += i++;
            }
        </script>
    </body>
</html>
4

5 に答える 5

23

ロックを伴う大きな違いがあります。最初のアプローチでは、whileループは停止せずに永久に実行され、プロセッサの 100% を占有するため、ユーザーの CPU をロックアップします。setInterval実際には暗黙的な最小量があり、ブラウザによって異なります。10ms前後だと思います。したがって、setInterval実際には 10 ミリ秒ごとに 1 ミリ秒程度しか実行されていないため、単純な更新を行っています。これはプロセッサにとっては厳しいものですが、プロセッサの 100% を必要とするわけではなく、オペレーティング システムによるタスク管理で軽減できます。

于 2013-02-12T19:50:36.693 に答える
15
  • while(1)無限ループが生成されます。つまり、JavaScript は単純に永久に実行され、制御をブラウザーに戻すことはありません。そのため、ブラウザーはフリーズします。これは、(スクリプトが強制終了されるまで) 他の操作を行うことができなくなるためです。

  • setTimeout(func, 0)実行後、制御がブラウザに返され、ブラウザがその後の動作を決定するという意味で、動作が異なります。0ms を設定しても、JavaScript コードが停止直後に実行されるとsetTimeout は限りません。0ms パラメーターを使用すると、コードが停止した直後にコードを実行することをブラウザーに伝えるだけですが、ブラウザーは実際に実行する前に他のことを自由に実行できます。

于 2013-02-12T19:53:44.240 に答える
13

ブラウザの Javascript はシングル スレッドで、イベント ドリブンです。2 つのものが同時に実行されることはなく、イベント ループが王様です。JS が (関数を終了することによって) 単一のスレッドの制御を放棄しない場合、そのスレッドは他に使用できません。同じスレッドが JS と DOM を処理するため、JS がスレッドを占有している場合、ユーザーは何もスクロールしたりクリックしたりすることさえできません。

setInterval(または実際にはsetTimeout)遅延が0(秒ではなくミリ秒)の場合、指定された遅延の後にこの関数をイベントキューに追加することを意味するだけで、関数がその正確な時間に実行されるという保証はありません。

EDIT : 実際には、Web ワーカーはメインのブラウザ スレッドと同時に JS を実行できますが、同じメモリをまったく認識しないか、DOM にアクセスできないため、上記のポイント/仮定はそのまま維持されます。 .. Web ワーカーを使いたい場合は、JS や関数型プログラミングについて十分に理解している必要があります。

EDIT(再度):なぜ永遠にループしたいのですか?ポーリングしている場合 (私が思いつく唯一の理由)、そうしないでください。特にJSでは、ほとんどの場合、より良い方法があります。機能的な方法は、イベントが発生したときに実行する関数 (ポーリングしているもの) を定義し、その関数をイベントにアタッチすることです (これを行う方法はイベントによって異なります)。

于 2013-02-12T19:51:51.640 に答える
5

while(true) は、条件付きループが終了するまで実行をブロックしますが、これは決して起こらないことが既にわかっています。(クロム)

setInterval は、xミリ秒ごとに任意のコードを実行するように環境に指示します。「スケジューラ」がまだ制御を持っているため、ブラウザーをブロックしません。

于 2013-02-12T19:54:45.377 に答える
1

終わりのないループを使用し、各ステップごとに DOM を操作する特定の理由はありますか?

ループを使用するwhileと、ブラウザとクライアントが完全にロックされる可能性が高く、何らかの方法で終了しないと、CPU の過負荷が発生する可能性もあります。

ループwhileは、可能な限り最小のマイクロ秒で作業を完了しようとします。そのため、1 秒間に 100 万ステップ、あるいはそれ以上のステップを実行しようとすることさえあるかもしれません。この場合、それはクライアントによって異なります。ただし、そのような速度で DOM を更新することはできません。

for の場合、 loop とはsetIntervalかなり異なりwhileます。実際には、 a と呼ぶ方が適切function repeaterです。指定された時間が経過すると、指定された関数を繰り返します。そのため、時刻が 0 の場合でも、チェックするステップがありますif the waiting time has passed now, and should the next repeat be run

そのため、while ループは 0 秒の遅延よりも瞬時であると考えることができます。

于 2013-02-12T19:58:27.603 に答える