モデルに基づくビューを表示していて、モデルの変更イベントにバインドするとします。
this.model.on('change', this.render);
on
呼び出しには2つのことがわかります。
- イベント名、単純な文字列。
- ハンドラー、関数。
on
で何this
を意味するのかを知る方法はなくthis.render
、関数を見るだけです。on
上記の呼び出しとこれの違いさえ知りません:
this.model.on('change', function() { ... });
関数に特定のコンテキストが必要な場合は、次の2つの選択肢があります。
- 、、、、 CoffeeScripts 、クロージャートリック、またはバインドされた関数を作成またはシミュレートする方法のいずれかを使用して
_.bind
、バインドされた関数を作成します。_.bindAll
Function.bind
$.proxy
=>
var _this = this
次のように言って、必要なコンテキストを伝えます。
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);
});
そして、そのいずれにもほとんど意味がありません。this
insideの値は、を呼び出すコードon
のの値とはほとんど関係がありません。JavaScriptでは変数ではなく、現在の呼び出しコンテキストを参照するキーワードです。this
on
this