Ajaxer

coding at the front{end}

JavaScript als funktionale Programmiersprache – Teil 6 – Geschachtelte Scopes und der globale Namensraum

| Keine Kommentare

Geschachtelte Scopes und der globale Namensraum

Jede Laufzeitumgebung hat einen globalen Namensraum. Dieser globale Namensraum ist ein globales Objekt. Das globale Objekt ist, wenn man sich nicht innerhalb einer Funktion befindet, das this-Objekt. Immer, wenn eine globale Variable deklariert wird, wird diese zu einer Eigenschaft des globalen Objekts. Variablen, die ohne die var-Anweisung deklariert werden, werden automatisch zu globalen Variablen.

Das Problem am globalen Objekt ist, dass jede Funktion Zugriff auf dieses globale Objekt hat. Wenn eine Funktion beispielsweise eine Variable status im globalen Objekt definiert, eine andere Funktion – z.B. aus einer Bibliothek – später eine Variable mit gleichem Namen ebenfalls im globalen Objekt definiert, so überschreibt diese zweite Funktion die Variable der ersten Funktion. Das globale Objekt eignet sich also nicht, um Variablen zuverlässig zu speichern.

Scope Chain in JavaScript als funktionale Programmiersprache - Teil 6 - Geschachtelte Scopes und der globale Namensraum - Ajaxer

Am besten wird dieser Zusammenhang von Nicholas C. Zakas in seinem Buch »High Performance JavaScript« dargestellt:

Funktionen sind Objekte und haben Attribute wie jedes andere Objekt. Eines dieser Attribute ist das interne Scope-Attribut.

Das Scope-Attribut enthält eine Sammlung von Objekten, die den Scope repräsentieren, in dem die Funktion erzeugt wurde. Diese Sammlung wird die »scope chain« (Scope-Kette) genannt.

Jedesmal wenn die Funktion ausgeführt wird, wird ein neuer interner Ausführungskontext erzeugt. Er repräsentiert den Kontext, in dem die Funktion ausgeführt wird. Dieser Ausführungskontext wird gelöscht, wenn die Funktion beendet wird.

Der Ausführungskontext wird verwendet, um Namen (z.B. von Variablen) aufzulösen. Die Inhalte des Scope-Attributs, das bei der Definition der Funktion erzeugt wurde, wird in den Ausführungskontext kopiert. Sobald dies beendet ist, wird ein Activation-Objekt erzeugt, das ebenfalls in den Ausführungskontext kopiert wird, und zwar an die erste Stelle. Das Activation-Objekt enthält alle lokalen Variablen, den Bonusparameter arguments und das this-Objekt.

Wenn ein Name aufgelöst werden soll, dann werden alle Objekte, die in der Scope-Kette liegen, durchsucht. Es wird z.B. zuerst das Activation-Objekt, dann das globale Objekt durchsucht.

Wenn eine Funktion innerhalb einer anderen Funktion erzeugt wird, dann enthält die Scope-Kette des inneren Objekts ein Scope-Objekt zwischen dem Activation-Objekt und dem globalen Objekt, das dem Activation-Objekt der äußeren Funktion entspricht. Bei der Auflösung eines Namens wird also zuerst das Activation-Objekt der inneren Funktion, dann das Activation-Objekt der äußeren Funktion und zum Schluss das globale Objekt durchsucht.

Vereinfacht ausgedrückt bedeutet dies, dass ein Name von innen nach außen aufgelöst wird. Es wird von innen nach außen so lange nach dem Namen gesucht, bis er gefunden wird (je tiefer die Schachtelung der Scopes, desto länger dauert es, einen Namen aufzulösen – die Dauer der Namensauflösung lässt sich jedoch in der Regel vernachlässigen).

Für das Activation-Objekt der äußeren Funktion bedeutet dies aber, dass das Activation-Objekt nicht dann schon vom Garbage Collector gelöscht werden kann, wenn die äußere Funktion beendet wurde, sondern erst dann, wenn auch die innere Funktion beendet ist, da die innere Funktion noch eine Referenz auf das Activation-Objekt der äußeren Funktion hält. Dies kann zu Speicherproblemen wie Memory-Leaks führen.

Cover-klein in JavaScript als funktionale Programmiersprache - Teil 6 - Geschachtelte Scopes und der globale Namensraum - AjaxerDies ist eine autorisierte Leseprobe aus dem Buch Oliver Ochs – JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server – dpunkt.verlag GmbH 2012. Weitere Leseproben folgen in Kürze.

Im nächsten Blogbeitrag werden wir uns – man ahnt es schon – Closures widmen.

Autor: Oliver Ochs

Oliver Ochs ist bei der Management- und IT-Unternehmensberatung Holisticon AG in Hamburg tätig. Er beschäftigte sich in den letzten Jahren mit Content Management Systemen, Webframeworks und Portalen auf Java-Basis. In diesem Umfeld arbeitete er als Entwickler, Architekt und Projektleiter. Er hat darüber hinaus Erfahrungen in Schulungen und Coachings. In letzter Zeit setzte er einen seiner Schwerpunkte auch auf Web- Application-Security, Identity-Management und neue Seiten von JavaScript. Ein anderer persönlicher Schwerpunkt sind agile Methoden und Prozesse

Schreib einen Kommentar

Pflichtfelder sind mit * markiert.