1
$(document).ready(function(e) {

    var count=10;
    setInterval(timer, 1000); 
    var green = true;

        function timer()
        {

              if (count < 1)
              {
                 count = 10;
                 setInterval(timer, 1000);

                 green ? green=false : green = true;                    
              }

              $('#tl').empty();

              if(green)
                $('#tl').append(count).css('color', '#090');

              else
                $('#tl').append(count).css('color', '#F00');

              count = count - 1;
        }
});

シンプルな信号機カウンターです。最初は 10 9 8 7 6 5 4 3 2 1 として実行され、次に 10 8 6 4 2 0 になり、次に 10 7 4 1 になります。

4

2 に答える 2

0

複数回作成/設定する必要はありません。

     if (count < 1)
         {
             count = 10;
             // setInterval(timer, 1000); < -- remove this line

             green ? green=false : green = true;                    
         }
于 2013-08-15T09:34:01.340 に答える
0

私は@chernivが元のコードのタイプミスである答えをすでに与えていることに気づきましたが、あなたが言ったようになぜそれが与えられたのか少し疑問に思いました

最初は 10 9 8 7 6 5 4 3 2 1 として実行され、次に 10 8 6 4 2 0 になり、次に 10 7 4 1 になります。

したがって、基本的には、関数を呼び出す関数のようなことを行っています(ほぼ再帰のようですが、もちろんjavascriptコンテキストにより異なります)。関数setInterval(timer, 1000)は、それ自体から再度呼び出されています。

したがって、初めて10 レベルの深さになると、

10 9 8 7 6 5 4 3 2 1

次にcount < 1が true の場合、setInterval(timer, 1000)すでにバックグラウンドで実行されている(いわば) 関数はほぼ瞬時に起動し、2 つの間の時間差はほとんどありません (同じように起動し始めたため)

したがって、これにより、counter変数は 1 ではなく 2減少し、差はほとんどありません。あなたに与える

10 8 6 4 2 0

間隔が連続的に減少する次の間隔についても同様です。

なぜそのように振る舞うかを理解するのに役立つことを願っています:)

于 2013-08-15T09:57:05.153 に答える