6

ボタンの押下に応答してアニメーション化し、自動的に実行されるjQueryコンポーネントを作成しています。この関数が再帰的かどうか疑問に思っていたのですが、うまくいきません。

function animate_next_internal() {

  $('#sc_thumbnails').animate(
    { top: '-=106' }, 
    500, 
    function() {
      animate_next_internal();
    }
  ); 
}  

私の実際の関数は、停止と開始を可能にするためにもっと複雑です。これは単純化された例にすぎません。

編集イベントが内部でどのように処理されるかに応じて、スタックがオーバーフローする場合とオーバーフローしない場合があります。可能性:

  1. animate()はdoneコールバックを直接呼び出します。この場合、オーバーフローは避けられません。

  2. animate()は、外部ディスパッチメカニズムによる呼び出しのコールバックをスケジュールしてから終了します。この場合、コールバックはオーバーフローしません。

4

2 に答える 2

9

最初はメモリがオーバーフローするのではないかと思っていましたが、確認のために簡単なテストを作成しました

function test(){
  $(".logo img").css("position", "absolute");
  $(".logo img").css("top", "100px");
  $(".logo img").animate({top:0}, 500, function(){
      test();
      console.log("exits here");
  });
}

test();

そして驚くべきことに、私は見ました

exits here
exits here
exits here
exits here
exits here
...

私のログに。「animate()は、外部ディスパッチメカニズムによる呼び出しのコールバックをスケジュールしてから終了します。この場合、オーバーフローすることはありません。」のように見えます。正解です

于 2010-04-25T01:42:03.973 に答える
0

そのような実装はコールスタックをオーバーフローさせると思います。単純化しない限り、関数が再帰を取り消すような、ある種の終了条件が必要です。あなたはおそらくこのようなものが必要です:

function animate_next_internal() {

  if ( some_condition ) return;

  $('#sc_thumbnails').animate(
    { top: '-=106' }, 
    500, 
    function() {
      animate_next_internal();
    }
  ); 
}  

some_conditionが再帰に関連するものである場合、おそらく#sc_thumbnails実際のトップが、ページ上またはその親内で0などの制限に達した場合です。

于 2010-04-24T23:46:15.770 に答える