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