2010-12-22 13 views
1

einen starken C++ Hintergrund zu haben, frage ich mich, wie diese in Actionscript funktioniert:Wie funktioniert der Rückruf in Actionscript 3?

class A { 

    public function callme():void { 
    } 

    public function foo():void { 
     var a:Function = callme; 
     a(); 
    } 
} 

Die Frage ist: ist Actionscript „heimlich“ neben dem Zeiger Funktion einen Objektzeiger übergeben?

Hier ist eine andere Frage: Ist es möglich, so etwas wie dieses (Pseudo-Code) zu tun:

class A { 

    public function callme():void { 
    } 

    public function foo():void { 
     var a:Function = callme; 
     var classAinstance:A = new A(); 
     classAinstance.a(); 
    } 
} 

d.h separate Funktion und Objektzeiger haben.

Antwort

2

Ja, Flash übergibt den Objektkontext zusammen mit dem Funktionszeiger. Dies ist nicht immer der Fall, gilt jedoch ab ActionScript 3.0. Siehe hier:

http://www.adobe.com/devnet/actionscript/articles/actionscript3_overview.html

Methode Verschlüsse

Ereignisbehandlung in Actionscript 3.0 dank Verfahren Verschlüsse vereinfacht, die Veranstaltung Delegation-in gebaut bieten. In ActionScript 2.0 erinnert sich eine Closure nicht daran, von welcher Objektinstanz sie extrahiert wurde, was zu unerwartetem Verhalten führte, als die Closure aufgerufen wurde. Die mx.utils.Delegate-Klasse war eine beliebte Problemumgehung; es zu benutzen, würden Sie Code schreiben, wie folgt:

myButton.addEventListener("click", Delegate.create(this, someMethod)); 

Diese Klasse wird nicht mehr benötigt, da in Actionscript 3.0 wird ein Verfahren Verschluss erzeugt werden, wenn irgendeinemethode verwiesen wird. Die Methode Closure erinnert sich automatisch an ihre ursprüngliche Objektinstanz. Nun kann man einfach schreiben:

myButton.addEventListener("click", someMethod); 

Was Ihre zweite Frage, wenn Sie eine Methode im Zusammenhang mit einem anderen Objekt ausgeführt werden sollen, dann .call() oder .apply() verwenden.

a.call(classA); 

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Function.html?filter_coldfusion=9&filter_flex=3&filter_flashplayer=10&filter_air=1.5

+1

function.call (Objekt)? Hölle einer Syntax! –

+0

@Bill Kotsias, alles ist ein Objekt, und eine Funktion ist ein Objekt, also warum kann eine Funktion selbst keine Funktionen haben? :-) –

1

bitte versuchen Sie eine Frage zu einem Zeitpunkt, zu fragen.

ActionScript verwendet keine Zeiger per se. Wenn Sie die Funktion eines Objekts übergeben, übergeben Sie die Funktion im Kontext dieses Objekts. Die Funktion verweist weiterhin auf das Objekt, von dem sie stammt.

Sie würden wirklich brauchen, um die Actionscript-Entwickler zu fragen, welche tatsächlich hinter den Kulissen passiert, aber ich bin sicher, dass Sie eine Antwort nach dem Vorbild der „wir unter einem non-disclosure agreement sind“ bekommen würden

Soweit Ihre Pseudo-Code betrifft, so denke ich, Sie classA.a();

als A Klasse, die Sie definiert schreiben gemeint haben weder hat eine Eigenschaft, noch eine Funktion a, die öffentlich sichtbar ist, ruft classA.a(); nicht funktionieren.