Ajaxer

because we know how

JavaScript als funktionale Programmiersprache – Teil 7 – Closures und Module

| Keine Kommentare

Closures und Module

Funktionen beinhalten Code. Eine Funktion wird stets in einem Funktionsgeltungsbereich ausgeführt. In der theoretischen Fachliteratur wird eine Kombination aus Code und Geltungsbereich als Closure bezeichnet.

Der Funktionsgeltungsbereich gilt auch, wenn in einer Funktion eine weitere, innere Funktion definiert wird. Diese Funktion hat dann Zugriff auf die Variablen der äußeren Funktion. Ausnahmen sind hier this und der Bonusparameter arguments, da diese Parameter von jeder Funktion selbst überschrieben werden, damit in der Scope-Kette die eigene this-Variable und der Bonusparameter arguments vor denen der äußeren Funktion gefunden werden.

Soll die this-Variable der äußeren Funktion der inneren Funktion zur Verfügung gestellt werden, so ist es üblich, in der äußeren Funktion eine that-Variable zu definieren und dieser die this-Variable zuzuweisen. Dann kann die innere Funktion über die that-Variable auf die this-Variable der äußeren Funktion zugreifen. Ein anderer üblicher Name für die that-Variable ist self. Dies ist aber verwirrend, da self in manchen Sprachen wie Smalltalk eigentlich der this-Variablen entspricht. Hier ein Beispiel für eine Closure.


    function outerFunction() {
       var x = "Hello";
       function innerFunction() {
           return x; 
       }
       return innerFunction();
    }
    console.log(outherFunction()); // Hello

Die innere Funktion innerFunction hat Zugriff auf die Variable x der äußeren Funktion outerFunction. Dieses Verhalten ist auf den ersten Blick nicht weiter überraschend. Interessant werden Closures, wenn eine innere Funktion zurückgegeben wird.

Diese innere Funktion hat nämlich Zugriff auf die Variablen der Funktion, in der sie definiert wurde. Diese Besonderheit wird in der Praxis als Closure bezeichnet.

Closures lassen sich verwenden, um private Variablen zu deklarieren. Man spricht dann von Modulen.

JavaScript kennt eigentlich keine privaten Variablen, aber es kennt Geltungsbereiche. Die folgende anonyme Funktion hat eine Variable variable. Auf diese Variable hat die innere Funktion inc Zugriff. Diese innere Funktion wird als Rückgabewert der Variablen incrementor zugewiesen. incrementor hat nun Zugriff auf die Funktion inc, nicht jedoch auf die Variable variable. Diese Variable erscheint nun wie eine private Variable.


    var incrementor = function () {
       var variable = 0;
       return {
          inc : function() {
             return variable ++;
          } 
       };
   }();
   console.log(incrementor.inc()); // 0 
   console.log(incrementor.inc()); // 1 
   console.log(incrementor.variable); // undefined

Wichtig zu verstehen ist, dass die innere Funktion wirklich Zugriff auf die Variablen der äußeren Funktion – das Activation-Objekt – hat und nicht nur auf eine Kopie. Wenn sich die Variable der äußeren Funktion verändert oder von der inneren Funktion verändert wird, so erfolgt der Zugriff zukünftig auf die geänderte Variable. Es lassen sich mit Closures also keine Zustände konservieren.

Cover-klein in JavaScript als funktionale Programmiersprache - Teil 7 - Closures und Module - 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.

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.