2012-12-03 5 views
7

Ich habe eine Member-Funktion render(). Diese Funktion ruft ein anderes Mitglied der Klasse add (any) auf. Dies ist das Snippet.Das Schlüsselwort this in Typoskript. Ist es ein Fehler?

Wenn ich das Schlüsselwort "this" addiere, ist der Typ Fenster. Ich würde erwarten, dass es die Instanz der Mitgliedsklasse ist.

In einem Konstruktor, einer Memberfunktion oder einem Member-Accessor ist dies der Klasseninstanztyp der enthaltenden Klasse.

Antwort

3

Ich glaube nicht, dass es ein Fehler ist.

Sie befinden sich nicht mehr im Bereich der render()-Funktion, sondern im Bereich each().

Try this:

render(){ 
    var that = this; 
    collection.each(that.add); 
} 
+6

IMO, es ist ein Fehler, aber in der TypeScript-Sprachdefinition. "This" innerhalb einer Klasse sollte sich auf die Klasseninstanz "period" beziehen. Die Art und Weise, in der JavaScript ändert, worauf "this" verweist, je nachdem, wie die Methode aufgerufen wird, ist einer ihrer schlimmsten Fehler (in einer Sprache, die voll von ihnen ist). Wenn TypeScript eine echte Obermenge von JavaScript sein will, kann es das für normale Methoden nicht ändern, aber es kann und sollte es unbedingt für Klassenmethoden ändern. –

+4

Aber Sie sind innerhalb einer Callback-Schließung (von 'each()', nicht 'render()'). Closure Scoping ist ein grundlegendes Merkmal von JS und daher von TS. Wie auch immer, es könnte ein * Feature * sein, das Sie (und das OP) nicht mögen, aber es ist sicherlich beabsichtigt und entspricht der veröffentlichten Spezifikation, also ist es definitionsgemäß kein * Bug *. Viel zu viele Posts über SO, IMO, Trompete, offensichtliche "Bugs" in ihren Titeln: Es ist ein Begriff, der mit mehr Sorgfalt verwendet werden sollte. – JcFx

+5

Einverstanden, dass es kein Fehler in der Implementierung ist - nur in der Spezifikation :-). Vielleicht wäre ein Workaround (auf der Spezifikationsebene) ein anderes Schlüsselwort - "ich"? - 'das'? - die immer auf die Klasseninstanz, nicht auf das Objekt, dem die Methode zugewiesen wurde, zeigt. –

16

Wie JcFx weist darauf hin, Ihre this Tragweite im each Rückruf unterscheidet.

Wenn Sie jedoch eine ‚fetter Pfeil‘ anonyme Funktion verwenden, die lexikalischen Scoping-Regeln für this verwenden, so dass Sie bekommen, was Sie suchen:

render(){ 
    collection.each((x) => this.add(x)); 
} 

Compiliert an folgenden JavaScript:

X.prototype.render = function() { 
    var _this = this; 
    collection.each(function (x) { 
     return _this.add(x); 
    }); 
} 

ist eine weitere Option explizit bind auf die add Aufruf der gewünschten this:

render(){ 
    collection.each(this.add.bind(this)); 
} 
+0

+1 Für eine elegantere und genauere Lösung. – JcFx

Verwandte Themen