JavaScript/Tutorials/Namensräume

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Namensräume (im Englischen namespaces genannt) dienen beim Programmieren dazu, Programmteile, oder Module von Programmen voneinander zu trennen. Die verschiedenen Programmiersprachen lösen dieses Problem auf ihre jeweilige Art, in JavaScript jedoch ist syntaktisch keine Möglichkeit für Namensräume vorgesehen. Die Objektstruktur der Sprache macht es aber möglich, etwas ähnliches wie Namensräume zu haben.

Inhaltsverzeichnis

[Bearbeiten] Grundlage: Globale Variablen und lokale Variablen

Der Geltungsbereich von Variablen in JavaScript bietet die Möglichkeit, ein Objekt im globalen Gültigkeitsbereich zu definieren:

Beispiel
myObj = new Object();
 
const myObj2 = {};
Die Notation ohne das Schlüsselwort var macht aus der Variable myObj eine Eigenschaft des window-Objektes, nämlich window.myObj, was in JavaScript auch als "globale Variable" bezeichnet wird. In diesem Fall kann man auch das Schlüsselwort const benutzen, da das zugewiesene Objekt später nicht durch ein anderes ersetzt werden soll, auch wenn dieses Objekt später vielleicht verändert wird, was nach der Deklaration mit const möglich ist.

Das sieht zunächst sehr trivial aus, bietet aber interessante Möglichkeiten, da an ein solches Objekt beliebige Eigenschaften (lies: Variablen) und Methoden (lies: Funktionen) gebunden werden können. Hier ein Vergleich:

Beispiel
function init () { alert("start!"); }
 
myObj.init = function () { alert("myObj start!"); }

Man kann die Funktion init als globale Funktion betrachten. Ihre Definition geschieht im globalen "Namensraum" (lies: Geltungsbereich). Damit wird sie, und das ist im Browser so geregelt, eine Methode des window-Objekts und kann z.B. mittels window.init() aufgerufen werden. Anders verhält es sich mit myObj.init(). Ein solcher Aufruf würde eine völlig andere Funktion mit dem gleichen Namen init ausführen, nämlich die gleichnamige Methode des myObj-Objekts, aber eben nicht window.init. Und das ist ja der Sinn von Namensräumen.

[Bearbeiten] Objekte als Namensräume

Möchte man ein Programm auf einer Seite einbinden, dessen Variablen und Funktionen technisch von möglichen anderen JavaScript-Programmen getrennt sein sollen, kann man ein Objekt als Namensraum benutzen und die Variablen und Funktionen zu dessen Eigenschaften und Methoden machen.

Viele in JavaScript geschriebene Programme, die man als Komponenten in seine eigenen Projekte einbinden kann, verwenden ihren eigenen Namensraum, indem sie ein eigenes Objekt als eine Eigenschaft des window-Objektes definieren. Dazu zählen Frameworks wie jQuery, oder Editoren wie Codemirror oder TinyMCE.

[Bearbeiten] Alternative zu Namensräumen

In JavaScript kann es sinnvoll sein, sein Projekt unter einen Namensraum zu stellen, insbesondere dann, wenn man aus anderen Kontexten auf dessen Daten, also Eigenschaften, zurückgreifen möchte (z.B. um Einstellungen für die Funktionsweise dieses Programms vorzunehmen) oder um seine Funktionalitäten für andere Projekte verfügbar zu machen (das tut das oben erwähnte jQuery).

Manchmal aber braucht man diese Zugriffsmöglichkeit "von außen" nicht. Da ist es praktischer, rein mit lokalen Variablen und lokalen Funktionen zu arbeiten. Um das zu können, "verpackt" man das eigene Programm in eine anonyme Funktion, die so notiert wird, dass sie sofort ausgeführt wird. Eine solche Verpackungsfunktion nennt man im Englischen "immediately invoked function expression" (IIFE), zu deutsch "sofort ausgeführter Funktionsausdruck". Hier ein Beispiel:

Beispiel: sofort ausgeführter Funktionsausdruck (IIFE)
(function () {
 
    var lokaleVariable1 = "Wert";
    var lokaleVariable2 = "anderer Wert";
 
    function lokaleFunktion1 () {
        alert("lokaleVariable1: " + lokaleVariable1);
    }
 
    function lokaleFunktion2 () {
 
        lokaleFunktion1();
 
        alert("lokaleVariable2: " + lokaleVariable2);
    }
 
    lokaleFunktion2();
 
}());

Durch die umgebende anonyme Funktion werden die lokalen Variablen und Funktionen vor anderen JavaScripten "versteckt", da sie außerhalb deren Geltungsbereich liegen. Auch gehören sie keinem bestimmten Objekt, über das man auf sie zugreifen könnte. Streng genommen gehören sie zum Funktionsobjekt, welches hinter der anonymen Funktion steht, aber auch auf dieses haben andere Scripte keinen Zugriff.

Das ebenso hier vorgestellte Tutorial TicTacToe als Browsergame bedient sich dieser Vorgehensweise.

[Bearbeiten] siehe auch

Meine Werkzeuge
Namensräume

Varianten
Aktionen
Übersicht
Index
Mitmachen
Werkzeuge
Spenden
SELFHTML