18

setInterval は、必要な間隔よりも時間がかかるコールバック関数をどのように処理しますか?

コールバックが最初の引数として遅延ミリ秒数を受け取る可能性があることを読みましたが、遅延する理由 (ジッター、または実行時間の長い関数) を見つけることができませんでした。

そして素晴らしいフォローアップですが、一般的なブラウザでは動作が異なりますか?

4

1 に答える 1

22

John Resig によるタイマーに関する優れた記事を引用させてください。

setTimeout(function(){
  /* Some long block of code... */
  setTimeout(arguments.callee, 10);
}, 10);

setInterval(function(){
  /* Some long block of code... */
}, 10);

これら 2 つのコードは、一見すると機能的に同等に見えるかもしれませんが、そうではありません。特に、setTimeout コードは前回のコールバックの実行後、常に少なくとも 10 ミリ秒の遅延があります (それよりも長くなる場合がありますが、それよりも少なくなることはありません)。一方、setInterval は、最後のコールバックがいつ実行されたかに関係なく、10 ミリ秒ごとにコールバックを実行しようとします。

間隔は、実行に十分な時間がかかる (指定された遅延よりも長い) 場合、遅延なしで連続して実行される場合があります。

于 2009-12-29T19:44:34.287 に答える