0

次のコードがあります。

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);
    }
}

問題に対する他の解決策はありますか?私が思いついたアプローチの潜在的な問題は何ですか?

4

0 に答える 0