3

Backbone を始めたばかりですが、理解できないことの 1 つは、モデルの 'on()' メソッドが常に 3 つの引数 (イベント、ハンドラー、およびコンテキスト) を取る理由です。

ほとんどの場合、「これ」はコンテキストに使用されているようで、他の使用法は見たことがありません。あったとしても、私はまだ見たことがないので、かなり珍しいはずです。

だから私の質問は:いつ「これ」以外のコンテキストを使用するのですか?バックボーンはなぜこのように設計されているのですか? ところで、コンテキストを提供する必要がある理由は理解できますが、最後の引数をオプションにするのではなく、メソッドの構文で 3 つの引数を使用するように指定されているのはなぜだろうかということです。私は何かが欠けていると確信しています。誰かが私を理解するのを手伝ってください。ありがとうございました!

  • [編集] なぜ次のようなことができないのですか:

    model.on = function(event, callback){
      model.on_with_three_args.call(this, event, callback, this);
    });
    
    model.on_with_three_args = function(event, callback){
      /* whatever the on() is supposed to do */
    });
    
4

1 に答える 1

9

モデルに基づくビューを表示していて、モデルの変更イベントにバインドするとします。

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

on呼び出しには2つのことがわかります。

  1. イベント名、単純な文字列。
  2. ハンドラー、関数。

onで何thisを意味するのかを知る方法はなくthis.render、関数を見るだけです。on上記の呼び出しとこれの違いさえ知りません:

this.model.on('change', function() { ... });

関数に特定のコンテキストが必要な場合は、次の2つの選択肢があります。

  1. 、、、、 CoffeeScripts 、クロージャートリック、またはバインドされた関数を作成またはシミュレートする方法のいずれかを使用して_.bind、バインドされた関数を作成します。_.bindAllFunction.bind$.proxy=>var _this = this
  2. 次のように言って、必要なコンテキストを伝えます。

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

呼び出しスタックを展開して必要なものを確認する方法はthisないため、明示的にする必要があります。

バックボーンは次のようにコールバックを呼び出します。

node.callback.apply(node.context || this, ...);

ここnode.callbackで、はコールバック関数であり、node.contextはに与えられた3番目の引数(存在する場合)onです。コンテキストを指定しないと、が呼び出されたときに何thisが起こっても取得できます。trigger上記の例では、this最終的にモデルになります。

したがって、の3番目の引数はon実際にはオプションですが、デフォルト値はそれほど有用ではなく、より適切なデフォルトを選択する方法はありません。適切なコンテキストを選択するために必要な情報は、JavaScriptではアクセスできません。これが_.bindAll(this, ...)、バックボーンビューに非常に多くの定型文が表示される理由です。


このようなことを試した場合:

model.on = function(event, callback){
    model.on_with_three_args.call(this, event, callback, this);
});

その場合this、そのコンテキストでは通常、次のmodelようになります。

model.on = function(event, callback){
    model.on_with_three_args.call(model, event, callback, model);
});

また

model.on = function(event, callback){
    model.on_with_three_args(event, callback, model);
});

そして、そのいずれにもほとんど意味がありません。thisinsideの値は、を呼び出すコードonのの値とはほとんど関係がありません。JavaScriptでは変数ではなく、現在の呼び出しコンテキストを参照するキーワードです。thisonthis

于 2012-10-30T05:31:27.777 に答える