• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-11-2008, 11:36   #1 (permalink)
Neuer User
 
Registriert seit: May 2006
Ort: Bad Ischl, Österreich
Beiträge: 243
Exclamation this == global ?!

Hallo,

ich hab wiedermal ein komisches Problem:

ActionScript:
  1. public function MainClass()
  2.         {
  3.             trace("MainClass: this: " + this +" - " + getQualifiedClassName(this));
  4.             addEventListener(FlexEvent.INITIALIZE, test);
  5.         }
  6.         public function test(e:Event = null):void
  7.         {
  8.             trace("test: this: " + this +" - " + getQualifiedClassName(this));
  9.             var c:Button = new Button();
  10.             c.addEventListener(FlexEvent.INITIALIZE, function(evt:Event):void
  11.             {
  12.                 trace("FlexEvent.INITIALIZE: this: " + this +" - " + getQualifiedClassName(this));
  13.             });
  14.             c.addEventListener(MouseEvent.CLICK, function(evt:Event):void
  15.             {
  16.                 trace("MouseEvent.CLICK: this: " + this +" - " + getQualifiedClassName(this));
  17.             });
  18.             addChild(c);
  19.         }

Ich würde ja annehmen, dass dieser Code bei allen Trace als this-Klasse "Main" ausgeben würde. Macht er aber nicht:
Code:
MainClass: this: Main0 - Main
test: this: Main0 - Main
FlexEvent.INITIALIZE: this: [object global] - global
MouseEvent.CLICK: this: [object global] - global
Warum ist this in dem (anonymen) Eventhandler auf einmal "global" und im Eventhandler test wie gewünscht?!

Lg
Warappa

Flashdevelop 3
Flex 3 Projekt

Geändert von Warappa (04-11-2008 um 11:37 Uhr)
Warappa ist offline   Mit Zitat antworten
Alt 04-11-2008, 11:42   #2 (permalink)
Neuer User
 
Registriert seit: May 2006
Ort: Bad Ischl, Österreich
Beiträge: 243
OK, wenn ich aus der anonymen Funktion eine "richtige" Funktion mache, gehts. Aber sollte this nicht einfach this bleiben - auch in einer anonymen Funktion?
Warappa ist offline   Mit Zitat antworten
Alt 04-11-2008, 11:45   #3 (permalink)
as3 addict
 
Benutzerbild von Marcy_LH
 
Registriert seit: Jun 2002
Ort: Leipzig
Beiträge: 346
Nun,

die Funktion, die du hinzufügst hat nichts mit der Klasse zu tun...

Sie ist weder eine Objekt-Funktion der Instanz von Main, noch eine Klassen-Funktion der Klasse Main.

Du baust einfach eine Funktion in den Raum, und damit die Funktion weiß, wo sie überhaupt hingehört, wird sie an global attached...

wenn du die Funktion in der Klasse definierst ganz normal mit

PHP-Code:
private function handleFlexInitialize(evt Event) : void {} 
wirst du auch deine this Referenz auf Main haben...
Marcy_LH ist offline   Mit Zitat antworten
Alt 04-11-2008, 11:53   #4 (permalink)
Neuer User
 
Registriert seit: May 2006
Ort: Bad Ischl, Österreich
Beiträge: 243
...hatte ich schon "befürchtet".

Das Problem kenne ich aus AS2 Zeiten. Dort hab ich mir dann einfach eine lokale Variable ausserhalb der anonymen Funktion erzeugt und mit this belegt (so in etwa):
ActionScript:
  1. var thisObject:MainClass=this;
  2. ...
  3. c.addEventListener(FlexEvent.INITIALIZE, function(evt:Event):void
  4. {
  5.     thisObject.irgendeineVariableFunktionSonstwas=...;
  6. });
  7. ...

Ich dachte, diese unschöne Notlösung hätte sich in AS3 geändert.

Nungut: entweder diese unschöne Lösung oder eine richtige Klassenfunktion (letzeres ist wahrscheinlich besser)...

Danke nochmal für die Aufklärung Marcy_LH!

Warappa
Warappa ist offline   Mit Zitat antworten
Alt 04-11-2008, 11:55   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.854
Wieso stellt sich die Frage nach Instanzfunktionen?
Omega Psi ist offline   Mit Zitat antworten
Alt 04-11-2008, 12:01   #6 (permalink)
as3 addict
 
Benutzerbild von Marcy_LH
 
Registriert seit: Jun 2002
Ort: Leipzig
Beiträge: 346
Ich versteh die Frage nicht

Eine Handler-Funktion, die ein Event behandelt, das die Klasse betrifft, in der Klasse selbst zu erstellen, sollte doch schon sinnvoll sein, oder?
Marcy_LH ist offline   Mit Zitat antworten
Alt 04-11-2008, 13:06   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.854
Ich wollte damit ausdrücken, das anonyme Funktionen böse sind!

Der Weg ist der richtige. EventHandler sollten aber private sein.
Omega Psi ist offline   Mit Zitat antworten
Alt 04-11-2008, 13:08   #8 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Komisch, ist mir noch nie aufgefallen. Ohne this hast du auf jeden Fall Zugriff auf die Eigenschaften der Instanz.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 04-11-2008, 13:22   #9 (permalink)
Neuer User
 
Registriert seit: May 2006
Ort: Bad Ischl, Österreich
Beiträge: 243
Hi,

danke hazy fantazy,

(ha, ich wusste dass da was anders als in AS2 war!)

Das ist aber schon komisch (/blöd/...), oder?
Wie soll man denn auf die Idee kommen, dass, wenn man this weglässt, sich das Programm anders verhält (=richtig) als mit this (=falsch!?)?
Bzw. warum kommt kein Kompilerfehler? Bei AS2 ist das als Fehler festgestellt worden.
Warappa ist offline   Mit Zitat antworten
Alt 04-11-2008, 13:31   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.854
Ich schätze das hängt damit zusammen, dass die Funktion nicht an die Instanz gebunden ist sondern sich nur die Properties aus dem Scope holt.
Omega Psi ist offline   Mit Zitat antworten
Alt 04-11-2008, 13:41   #11 (permalink)
Neuer User
 
Registriert seit: May 2006
Ort: Bad Ischl, Österreich
Beiträge: 243
Also:
Scope != Instanz ?

Ist das seit AS3 neu? (denke mal ja)
Warappa ist offline   Mit Zitat antworten
Alt 04-11-2008, 14:24   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.854
Nein, denke ich nicht. Eine Instanz hat ihren eigenen Scope. Wenn eine Funktion aber anonym ist, wird sie in einem anderen Speicherbereich geschrieben und damit nicht der Instanz sondern dem global-Scope zugewiesen. Das wird in ActionScript 2 ähnlich laufen.

Und in ActionScript 2 gab es ja gerade die ScopeShifts die mit der Delegate-Klasse zu beheben waren. Das wurde in ActionScript 3 behoben -> Klassen sind sealed und müssen Instanzen in den Gültigkeitsbereich einer anderen Klasse eindringen (ihren Scope), so wird das mit EventListeners gemacht.
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
event, events, flex 3, global, konstruktor

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele