2

id のボタンがありますplay

このコードでそのボタンのカウントダウンが必要です。しかし、何らかの理由でこれを機能させることができません。

var timeoutTime = 500, seconds = 5;
var countdown = $("#play h4");
for(var i = seconds; i>0; i--)
{
    setTimeout(function() {
    countdown.text("" + i); },timeoutTime);
    timeoutTime += 1000;
}

私は多くのことを試しましたが、得られる最高のものは 5 4 3 2 1 ではなく 1 でした。このコードでは、ボタンに 0 が表示されます。

どうしたの ?

4

1 に答える 1

4

これを使って :

for(var i = seconds; i>0; i--) {
    (function(i){
      setTimeout(function() {
          countdown.text("" + i); }, timeoutTime);
    })(i);
    timeoutTime += 1000;
}

あなたの問題は、ループが終了した後に setTimeout に渡すコールバックが呼び出されるため、 i が変更され、常に i の最後の値で呼び出されていたことです。

古典的な解決策は、クロージャーを使用して、別の変数 (ここでは同じ名前の i) を目的の値に保持することです。これは、反復ごとに異なる関数であるため機能します (変数のスコープは、グローバル スコープまたは変数が宣言されている関数のいずれかです)。

于 2012-12-05T20:27:05.370 に答える