Gültigkeitsbereich von Funktionen

Der Gültigkeitsbereich einer Funktion legt nicht nur fest, an welcher Stelle im Programm diese Funktion aufgerufen werden kann, sondern auch, welche Definitionen auf die Funktion zugreifen können. Für Funktionsbezeichner gelten die gleichen Gültigkeitsbereichsregeln wie für Variablenbezeichner. Eine Funktion, die im globalen Gültigkeitsbereich deklariert ist, steht im gesamten Code zur Verfügung. Beispielsweise enthält ActionScript 3.0 globale Funktionen wie isNaN() und parseInt(), die sich an beliebigen Stellen im Code befinden können. Eine verschachtelte Funktion - eine Funktion, die innerhalb einer anderen Funktion deklariert ist - kann an beliebiger Stelle innerhalb der Funktion verwendet werden, in der sie deklariert wurde.

Unterthemen

Gültigkeitsbereichskette
Funktionshüllen

Gültigkeitsbereichskette

Jedes Mal, wenn eine Funktion die Ausführung beginnt, wird eine Reihe von Objekten und Eigenschaften erstellt. Zunächst wird ein besonderes, als Aktivierungsobjekt bezeichnetes Objekt erstellt, das alle im Funktionsrumpf erstellten Parameter und lokalen Variablen oder Funktionen speichert. Ein direkter Zugriff auf das Aktivierungsobjekt ist nicht möglich, da es sich um einen internen Mechanismus handelt. Zweitens wird eine Gültigkeitsbereichskette erstellt, die eine sortierte Liste der Objekte enthält, die Flash Player nach Bezeichnerdeklarationen durchsucht. Jede ausgeführte Funktion verfügt über eine Gültigkeitsbereichskette, die in einer internen Eigenschaft gespeichert ist. Bei einer verschachtelten Funktion beginnt die Gültigkeitsbereichskette mit ihrem eigenen Aktivierungsobjekt, gefolgt vom Aktivierungsobjekt der übergeordneten Funktion. Die Kette wird in dieser Weise fortgesetzt, bis sie das globale Objekt erreicht. Das globale Objekt wird erstellt, wenn ein ActionScript-Programm beginnt, und enthält alle globalen Variablen und Funktionen.

Funktionshüllen

Eine Funktionshülle (Function Closure) ist ein Objekt, das eine Momentaufnahme einer Funktion und ihrer lexikalischen Umgebung enthält. Die lexikalische Umgebung einer Funktion enthält alle Variablen, Eigenschaften, Methoden und Objekte in der Gültigkeitsbereichskette einer Funktion sowie deren Werte. Funktionshüllen werden immer dann erstellt, wenn eine Funktion unabhängig von einem Objekt oder einer Klasse ausgeführt wird. Die Tatsache, dass Funktionshüllen den Gültigkeitsbereich beibehalten, in dem sie erstellt wurden, führt zu interessanten Ergebnissen, wenn eine Funktion als Argument oder Rückgabewert an einen anderen Gültigkeitsbereich übergeben wird.

Im folgenden Beispielcode werden zwei Funktionen erstellt: foo(), die eine verschachtelte Funktion namens rectArea() zurückgibt, mit der die Fläche eines Rechtecks berechnet wird, und bar(), die foo() aufruft und die zurückgegebene Funktionshülle in einer Variablen namens myProduct speichert. Obwohl die Funktion bar() ihre eigene lokale Variable x (mit einem Wert 2) definiert, behält sie die in der Funktion foo() definierte Variable x (mit dem Wert 40) bei, wenn die Funktionshülle myProduct() aufgerufen wird. Die bar()-Funktion gibt daher den Wert 160 anstelle von 8 zurück.

function foo():Function
{
    var x:int = 40;
    function rectArea(y:int):int // Funktionshülle definiert
    {
        return x * y
    } 
    return rectArea;
}
function bar():void
{
    var x:int = 2;
    var y:int = 4;
    var myProduct:Function = foo();
    trace(myProduct(4)); // Funktionshülle aufgerufen
}
bar(); // 160

Methoden verhalten sich insofern ähnlich, als dass sie ebenfalls Informationen über die lexikalische Umgebung beibehalten, in der sie erstellt wurden. Diese Eigenschaft macht sich insbesondere dann bemerkbar, wenn eine Methode aus ihrer Instanz extrahiert wird, wodurch eine gebundene Methode entsteht. Der wesentliche Unterschied zwischen einer Funktionshülle und einer gebundenen Methode besteht darin, dass sich der Wert des Schlüsselwortes this in einer gebundenen Methode immer auf die Instanz bezieht, an die sie ursprünglich angefügt wurde, während sich der Wert des Schlüsselwortes this in einer Funktionshülle ändern kann. Weitere Informationen finden Sie unter Gebundene Methoden.


Flash CS3

 

Eine E-Mail an mich senden, wenn dieser Seite Kommentare hinzugefügt werden | Kommentarbericht

Aktuelle Seite: http://livedocs.adobe.com/flash/9.0_de/main/00000057.html