0

次の html が機能しない理由がわかりません。アラートを送信し続けることを期待しますが、1回で停止します。さらに、「左fn」アラートは発生しません!誰かが私にこれを説明できますか? ubuntuのfirefoxでjavascriptを使用してhtml5を使用しています。

<!DOCTYPE html>
   <script>
      function alertme() {
      alert ("in fn");
      }

      while (true) {
       window.setTimeout(alertme(), 3000);
   alert("left fn");
      }
   </script>
4

2 に答える 2

2
while (true) {
    window.setTimeout(alertme, 3000); //setTimeout wants a function, not the return value of the function
    alert("left fn");
}

ところで、すべてのメッセージボックスをクリックして楽しんでください...

于 2013-02-19T23:47:19.217 に答える
2

いくつかの考えられる問題:

  1. alertme()はすぐに呼び出され、return代わりにその値が に渡されsetTimeout()ます。

    これを修正するにはalertme、参照として渡すことができます (呼び出し括弧なし):

    setTimeout(alertme, 3000);
    
  2. ただし、これは JavaScript の (主に) シングルスレッドの性質と競合します。

    は非同期であるため、現在から 3 秒以上setTimeout()経過すると満了するタイマーを開始するだけです。ただし、遅延タスクを実行するには、1 つのスレッドが最終的にビジーでないことが必要です。

    ただし、 はwhile (true) {}同期的で無期限であるため、すべての実行が停止するまでスレッドをビジー状態に保ち、タイムアウトがタスクを実行することを決して許可しません。だから、あなたは決して見ることはありません"in fn"

    John Resig がタイマーについて詳しく書いています: http://ejohn.org/blog/how-javascript-timers-work/

コードを正確に修正する方法は、意図によって異なります。

于 2013-02-19T23:56:25.233 に答える