0

Backbone.js ソースを読んでいて、これに混乱しています

var triggerEvents = function(events, args) {
  var ev, i = -1, l = events.length;
  switch (args.length) {
    case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx);
    return;
    case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]);
    return;
    case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]);
    return;
    case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]);
    return;
    default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
  }
};

いくつか質問があります-

  1. なぜこれがイベントをトリガーするための最適化なのですか?(注釈付きソースが言うように)?
  2. ev.ctx とは?
  3. .callback() とは?

この構造は、機会があれば、速度のために apply ではなく常に call を使用する必要があることを意味します。この関数の構造は、「引数がいくつあるかわかっている場合は、代わりに call を使用し、apply を使用してください」と言っているようです。 apply を最後まで使用できる場合。

要するに、この関数の目的が何なのか、なぜこのように書かれているのかわかりません。

4

1 に答える 1

3

パフォーマンスを比較する小さなJSPerfテストスイートを作成しました。(Chrome 24を使用した場合)30〜50%高速であることを非常に明確に示しています。ブラウザで実行してみて、パフォーマンスの違いを確認してください。Function.callFunction.applyFunction.call

ただし、これは、独自のコードでこの最適化に従う必要があるという意味ではありません。バックボーンイベント機能はバックボーンの中核であり、多くのイベントが発生します。著者は、このコードを最適化して、パフォーマンスの最後の部分を絞り出しました。他のほとんどの場合、これは過度の最適化になります。

ev.callbackプロパティは、イベントのコールバック関数です。

次の例を考えてみましょう。

this.model.on('change', this.handleChange, this);

この場合のコールバックはthis.handleChangeメソッドです。

表記(ev = events[i]).callback.callは単なるショートカットです

ev = events[i];
ev.callback.call

javascriptでは代入操作が割り当てられた値を返すため、ショートカットは機能します。

一方、プロパティは、コールバック関数へのコンテキストev.ctxとしてバインドするオブジェクトです。オプションの引数としてコンテキストを取ります。上記の例では、最後の引数である、は、コールバック関数のコンテキストが包含クラスであることを指定しています。thisBackbone.Events.onthis

于 2013-02-19T22:24:51.130 に答える