67

私が取り組んでいるプロジェクトでは、_.debounce() を使用しています。

デバウンスに関する Underscore JS のドキュメントには、次のように書かれています。

デバウンス _.debounce(function, wait, [immediate])

渡された関数の新しいデバウンスされたバージョンを作成して返します。この関数は、最後に呼び出されてから待機ミリ秒が経過するまで実行を延期します。

これは明らかに、何が行われるかを知りたい人debounce()は、「デバウンス」が何を意味するかを既に知っていることを前提としています。

デバウンスは実際に何をしますか?

4

4 に答える 4

69

基本的に呼び出しを調整するため、短時間に複数回呼び出された場合でも、1 つのインスタンスのみが呼び出されます。

なぜあなたはそれを使うのですか?

window.onresize のようなイベントは、立て続けに複数回発生します。新しい位置で多くの計算を行う必要がある場合、計算を複数回実行することは望ましくありません。ユーザーがサイズ変更イベントを終了したときにのみ起動します。

于 2013-04-10T13:35:39.510 に答える
26

underscore.jsのソース コードからの説明:

呼び出され続ける限りトリガーされない関数を返します。関数は、N ミリ秒間呼び出されなくなった後に呼び出されます。'immediate' が渡された場合、トレーリングではなくリーディング エッジで関数をトリガーします。

それを自分でコーディングします:

_.debounce = function(func, wait, immediate) {
  var timeout, result;
  return function() {
    var context = this, args = arguments;
    var later = function() {
      timeout = null;
      if (!immediate) result = func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) result = func.apply(context, args);
    return result;
  };
};
于 2013-04-10T13:36:48.060 に答える
2

タイムアウトになるまで関数の実行を保留します。これは、必要のないときに関数が連続して実行されるのを避けるためです。underscore.debounce() は複雑なコードに依存しているため、注意してください。ほとんどの場合、関数内の単純な「if」ステートメントは、デバウンスよりもはるかに高速です。カウンタを実装して N 回の反復ごとにメソッドを実行するか、少なくとも一定のミリ秒が経過したことを確認するタイムアウトを実装できます。

于 2016-05-03T14:06:53.067 に答える