Hallo,
Dazu übergebe ich die methode, also obj.methode1 an eine Funktion, die meine Events handelt, und rufe sie darin auf:
raiseMyEvent: function(handler)
{
handler(); // handler ist z.B. obj.methode1
}
Funktionen haben keine Zugehörigkeit zu irgendeinem Objekt, d.h. generell, ein Objekt hat keine Zugehörigkeit zu einem anderen Objekt, an dem es zwischendurch man dranhängt (ich nenne es mal »Elternobjekt«).
this drückt einfach nur diese Elternobjekt-Unterobjekt-Beziehung aus. Und zwar nur in dem Fall, dass die Funktion auch auf diese Weise aufgerufen wird: obj.methode1().
Wenn man Funktionen als Objekte übergibt oder irgendwo anders speichert - und nichts anderes passiert, wenn du element.onevent = handlerfunktion; notierst -, dann ist der »Kontext«, wie man diese Beziehung nennt, passé. this drückt halt keine wesenhafte Verbindung zwischen Objekten aus, sondern wird situativ bestimmt (deshalb kann man mit apply auch beliebig daran schrauben).
Ähnliches ist, wenn ich schreibe:
var test = obj.methode1;
test();dann ist this auch anders.
Du legst hier eine zweite Referenz auf ein Funktionsobjekt an. Innerhalb einer Funktion als lokale Variable, außerhalb als Methode von window. In beiden Fällen ist this == window, das globale Objekt ist der Fallback-Kontext, sofern kein speziellerer existiert).
Es gibt eben keine »ursprüngliche« Zugehörigkeit zu obj, die Referenz obj.methode1 ist gleichwertig zu test. Beide verweisen nur auf eine Speicherstelle und this bestimmt sich bloß durch die Art und Weise, wie diese Funktion dann tatsächlich aufgerufen wird (test() versus obj.methode1()).
aber das ist ja irgendwie blöd, und für erstes problem auch nicht mehr machbar.
Ja, doch, siehe bind bzw. bindAsEventListener im von Joachim verlinkten Artikel.
Mathias