次のコードがあります。
function Obj() {
var container = [1, 2, 3];
this.callback_m = function() {
if (obj.exists(this)) {
//...
};
}
this.exists = function(element) {
return !(container.indexOf(element) == -1);
}
}
var obj = new Obj();
$(".elem").on('click', obj.callback_m);
オブジェクトのメソッドをコールバック関数として使用しています。このメソッドが呼び出されると、イベントがトリガーされた要素に「this」が設定されることは明らかです。「this」要素をオブジェクトの「exists」メソッドに渡して、コレクションに存在するかどうかを確認しています。ただし、「exists」メソッドを取得するには、オブジェクトを参照する「obj」変数を参照する必要があります。
obj.exists(this)
しかし、これは確かに間違った選択です。なぜなら、'obj' は別の名前を持っていたり、範囲外だったりする可能性があるからです。また、イベントがトリガーされた要素への参照が必要なため、ここでも bind() を使用できません。
私が思いついた唯一の解決策は、クロージャーを使用してそれ自体への参照を記憶することです。これが今の様子です:
function Obj() {
var container = [1, 2, 3];
var self = this;
this.callback_m = function() {
if (self.exists(this)) {
//...
};
}
this.exists = function(element) {
return !(container.indexOf(element) == -1);
}
}
問題に対する他の解決策はありますか?私が思いついたアプローチの潜在的な問題は何ですか?