40

作成したオブジェクトに問題があり、次のようになります。

var myObject = {

    AddChildRowEvents: function(row, p2) {
        if(document.attachEvent) {
            row.attachEvent('onclick', function(){this.DoSomething();});
        } else {
            row.addEventListener('click', function(){this.DoSomething();}, false);
        }
    },

    DoSomething: function() {
        this.SomethingElse(); //<-- Error here, object 'this' does not support this method.
    }
}

問題は、「DoSomething」関数内にいるときに、「this」が「myObject」を参照していないことです。何が間違っているのでしょうか。

4

5 に答える 5

39

関数が呼び出されるとき、「これ」は行を指します。オブジェクトが必要な場合は、次のように実行できます。]

AddChildRowEvents: function(row, p2) {
    var theObj = this;
    if(document.attachEvent) {
         row.attachEvent('onclick', function(){theObj.DoSomething();});
    } else {
         row.addEventListener('click', function(){theObj.DoSomething();}, false);
    }
},

関数が呼び出されると、関数が定義されたときにスコープ内にあった変数theOBjにアクセスできます。

于 2008-12-06T07:16:34.660 に答える
11

thisは常に内部関数を参照します。ネストされた関数がある場合は、別の変数を作成してそれを指す必要がありますthis

var myObject = {
    AddChildRowEvents: function(row, p2) {
        var that = this;
        if(document.attachEvent) {
            row.attachEvent('onclick', function(){that.DoSomething();});
        } else {
            row.addEventListener('click', function(){that.DoSomething();}, false);
        }
    }
}
于 2009-02-13T12:54:32.010 に答える
3

これは、クロージャに関する一般的な問題です。それを解決するには、次のようにしてみてください。

var myObject = {    
    AddChildRowEvents: function(row, p2) { 
        var self = this;

        if(document.attachEvent) {            
             row.attachEvent('onclick', function(){this.DoSomething(self);});        
        } else {            
             row.addEventListener('click', function(){this.DoSomething(self);}, false);        
        }    
    },    

    DoSomething: function(self) {       
        self.SomethingElse(); 
    }
}
于 2009-02-13T12:38:06.650 に答える