0

私は jQuery を初めて使用し、コンソール ログにこの "end of if" 行が表示される理由がわかりません。もし toggleBox が "if の終わり" コンソール ログ行の直前で自分自身を呼び出した場合、console.log() 関数はどのように処理されますか?

1 行目と 2 行目が繰り返されるように見えますが、なぜか 3 行目が実行されています。飛び跳ねているだけのようです。toggleBox の呼び出しは、実際には box.fadeToggle が呼び出される直前にそれ自体に戻り、if ブロックを終了してから、何らかの理由で box.fadeToggle に戻りますか?

$(document).ready(function() {
var box     = $("#box");
var para = $("p");
var i   = 0;

para.text(i);

function toggleBox(i) {
    console.log($.now() + " 1. entering toggleBox. i=" + i);
    box.fadeToggle(2000, function() {
        console.log($.now() + " 2. after fade time. i=" + i);
        i++;
        if (i < 4) {
            para.text(i);
            toggleBox(i);
            console.log($.now() + " 3. end of if. i=" + i);
        };
    });
};

toggleBox(i);

});

コンソール出力:

69387 1. トグルボックスに入ります。i=0

71398 2. フェード時間の後。i=0

71399 1. トグルボックスに入ります。i=1

71400 3. if の終わり。i=1

73396 2. フェード時間の後。i=1

73397 1. トグルボックスに入ります。i=2

73397 3. if の終わり。i=2

75398 2. フェード時間の後。i=2

75399 1. トグルボックスに入ります。i=3

75399 3. if の終わり。i=3

77399 2. フェード時間の後。i=3

4

1 に答える 1

0
box.fadeToggle(2000; function

fadeToggle を開始し、コールバックを登録してから戻ります。これは、toggleBox(i);深くは行かずにすぐに戻ることを意味するので、以下console.logが実行されます。

これは実際には再帰ではないことを認識する必要があります。コールバックはアニメーションの後でのみ呼び出されるため、現在の命令フローが続行されます。非同期操作でも同じ現象が発生します。

于 2013-07-27T16:08:59.113 に答える