Anonyme Funktionen als Ereignis-Handler in Aktion-Skript - gut oder schlecht?
Kam ich zu AS3 von JS-Welt, und ich bekenne, dass anonyme Funktionen sind meine Schwäche. Ich Neige dazu, verwenden Sie überall. Jetzt, kommen zu AS3 ich habe gehört und gelesen, an vielen Orten, DA und Flash sind enorm schlecht im handling, garbage collection, dass man leer ist, entsorgen Sie Sie und entfernen Sie alle event-Handler und-Objekte manuell zu vermeiden, seltsame und unerklärliche memory leaks und Abstürze. Nicht sicher, welcher Teil davon ist wahr, aber ich würde gerne befolgen Sie die best practices von Anfang an.
Also meine Frage wäre - wie schlecht ist die Idee der Verwendung von anonymen Funktionen als event Handler? Betrachten Sie zum Beispiel ein code wie dieser:
addEventListener(Event.ENTER_FRAME, function() : void {
controls.elapsed = stream.time;
});
contorls.verstrichene ist der setter, die abgesehen von der Einstellung der aktuellen Spielzeit für die video-player-updates die ganze UI und stream ist NetStream - Objekt, das die Ströme der eigentlichen video.
Gibt es genug andere Orte, wo anonyme Funktion kann den code sauberer und intuitiver. Überprüfen Sie den folgenden code für einfache fade-in-Effekt für die control bar:
public function showControls() : void
{
var self:Controls = this;
if (!visible) {
visible = true;
fadeTimer = new Timer(30, 10);
fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
self.alpha += 0.1;
});
fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
self.alpha = 1;
});
fadeTimer.start();
}
}
Ich Total mag, wie es aussieht und passt in den code, aber ich bin besorgt über Leckagen. Während Die Veranstaltung.ENTER_FRAME-handler würde wahrscheinlich nie werden schädlich in dieser form, was über die timer-Listener. Sollte ich entfernen Sie die Zuhörer mit der Hand, oder Sie werden automatisch entfernt, sobald ich fadeTimer = null ? Ist es möglich, entfernen Sie die Zuhörer mit anonymen Funktionen richtig an?
Gibt es irgendetwas, was ALS das nicht dazu führen, dass einige performance-und memory-Auswirkungen? 🙂 Gut, in meinem Verständnis anonyme Funktionen sind nur sinnvoll, wenn man nicht wiederverwenden, die diese Funktionen, nicht überladen wollen Klassendefinition und will die ganze Logik an einem Ort. Dies ist, wie und Wann Neige ich dazu, Sie zu benutzen. Danke für den link, ich werde es prüfen.
Hmm... "einige performance-und memory-impact", die tatsächlich stellte sich heraus, um ein Angebot sein. Was ist das für eine Aussage? Was bedeutet es, "einige"? Wenn dieser gelesen wird, indem es die Bedeutung, dann "einige" klingt wie zu vernachlässigenden Wert. Oder nicht? Wie sehr vage.
Es scheint, dass 'Aktivierungs-Objekt' ist nicht spezifisch für die ALS, sondern ist ein Teil von ECMA-standard. Und angelegt wird, für anonyme Funktionen in JS sowie. Aber das hält nicht jeder auf das web zu benutzen, richtig? Oder vielleicht WIE die Umsetzung der Funktion ist buggy und sluggy?
InformationsquelleAutor jayarjo | 2010-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nichts falsch mit der Verwendung von function-Methoden, wo es funktioniert. Soweit Speicherverluste gehen, die Sie benötigen, um das Objekt zu verfolgen, um die Bühne zu sehen, wenn es entfernt werden kann.
Hinzufügen eines
ENTER_FRAME
event-handler, um die Steuerung sorgt dafür, dass die Kontrolle hat einen Verweis auf die anonyme Funktion. Der code ist Teil des Steuerelements (oder so es scheint), ist dies in Ordnung, da der anonymen Funktion wird entfernt, wenn das Steuerelement ist.Hinzufügen eines event-handler für den timer sorgt dafür, dass die timer hat einen Verweis auf die anonyme Funktion. Wenn der timer läuft, wird es die anonym-Funktion Referenz lebendig, und durch Assoziation, die enture Kontrolle. Wenn der timer gestoppt ist, allerdings, sowohl Sie als auch die Funktion, die gesammelt werden sollten.
Wenn alles andere fehlschlägt, verwenden Sie die profiler und siehe! 😉
Ich meine, sollte die garbage collection zu entfernen es automatisch, wenn es führt einen sweep.
Der code von oben, die fadetimer nie Müll gesammelt. Entweder es Bedarf der ausdrücklichen removeEventListener, oder die Einstellung Ihrer addEventListener zu useWeakReferences = false. (d.h. addEventListener(type, callback, false[usecapture], 0[Priorität], wahr[useweakref]); Entfernen Sie das Steuerelement aus, die Stufe wird NICHT entfernen Sie den Ereignis-handler.
Ich will nicht entfernen Sie den Ereignis-handler, aber es ist das Objekt, das einen Verweis, um es für die garbage collection freigegeben (vorausgesetzt, es ist nicht Ihre Wurzeln anderswo).
InformationsquelleAutor Richard Szalay
Gerade gemerkt, dieser Beitrag ist -- es gibt ein paar Dinge, die vielleicht von Interesse für Sie sein. Man Argumente.angerufene (das ist eine Referenz auf die aktuelle Funktion, in der Sie sich befinden). Dies ist nützlich für das entfernen von Referenzen in anonymen Funktionen. Auch, es könnte darauf hingewiesen werden, dass Sie könnte Verwendung schwacher Referenzen in Ihrer addEventListener-code -- dies jedoch nicht für Variablen, die anonym sind, wie Sie bekommen würde, GC würd so ziemlich sofort. Der Einfachheit halber, schrieb ich Ihr code wie folgt: (sollte funktionieren-nicht getestet)
versteckt Nachteil ist, dass es nicht empfohlen. Ich habe einen test vor ein paar Tagen und es hat gut funktioniert-obwohl ich das immer noch nicht sehen es als die "großen" - option. Ich denke, die Schüler sind der beste Weg zu gehen. Sie sollten sich die Merkmale Objekt-es ist im Grunde ein verstecktes internes Objekt, das es ermöglicht flash für schnelle suchen der Mitglieder. Ich in der Regel wie zu Klumpen eine Reihe von Prozeduren zusammen mit der switch-event event-handling ein wenig einfacher. Diese Art von code ist nur zu Fragen, für eine utility-Klasse vorgenommen werden.
InformationsquelleAutor ansiart
Ich würde es tun so etwas wie dieses. Und, werden Sie sicher, dass die Verwendung von dispose (), wenn Sie wollen, stellen Sie sicher, deaktivieren Sie den timer, wenn die Unterbrechung.
Sorry. Weil Sie privat sind die Schüler.
Die Unterstriche sind eine häufige, aber nicht verpflichtet, die Konvention für die Benennung einer privaten Feld/variable
In der Regel Unterstrichen property-Namen verwendet, wo es eine begleitende accessor. Wenn eine Eigenschaft nicht zu haben, einen accessor, ich Schreibe einfach die Eigenschaft name ohne Unterstrich.
InformationsquelleAutor Mattias