Scriptease.js: Umgang von JavaScript mit Variablen

var-Schlüsselwort

var oder nicht var?

Gelegentlich begegnet man der Behauptung, die Verwendung des var-Schlüsselworts sei für globale Variablen nicht erforderlich, und

var x = 23;

außerhalb einer Funktion würde den gleichen Effekt erzielen wie:

x = 23; 

Das ist jedoch falsch. Bei Verwendung von var wird nämlich, wie bereits erwähnt, eine globale Variable angelegt. Entfällt das Schlüsselwort allerdings, wird keine Variable erzeugt, sondern dem globalen Objekt eine Eigenschaft mit dem angegebenen Namen hinzugefügt.

Da Variablendeklarationen intern ebenfalls Eigenschaften erzeugen, ist der effektive Unterschied zwischen diesen beiden Varianten minimal. Gemäß der Sprachspezifikation von ECMAScript verfügt jede Eigenschaft über Attribute, die ihr Verhalten beschreiben, wie ReadOnly oder DontDelete.

Genau in diesem Attribut liegt der Unterschied zwischen einer globalen Variablen und einer Eigenschaft des globalen Objekts: Eine globale Variable wird implizit mit dem Attribut DontDelete versehen, eine Eigenschaft nicht. Rein theoretisch ist es also denkbar, nicht mit var deklarierte "Variablen" mit dem delete-Schlüsselwort wieder zu entfernen:

var x = 23;
y = 42;

delete x;
delete y;

console.log(x);
console.log(y);

Das Löschen der globalen Variablen x schlägt fehl, verursacht allerdings keinen Fehler. Erst der Zugriff auf die beiden Variablen mit der log-Funktion offenbart, dass das Löschen der Variablen x nicht erfolgreich war; im Gegensatz zum Löschen der Variablen y. Während die erste Ausgabe nämlich wie erwartet den Wert 23 ausgibt, verursacht die zweite den bereits erwähnten ReferenceError.

In der Praxis verfügen die beiden Varianten noch über weitere Unterschiede, die unter anderem von der jeweils eingesetzten Laufzeitumgebung abhängen. Daher empfiehlt es sich, zur Deklaration von Variablen stets das Schlüsselwort var zu verwenden, innerhalb von Funktionen ebenso wie außerhalb.

Fazit

Der Umgang mit Variablen in JavaScript ist nicht schwierig, unter Umständen lediglich ein wenig gewöhnungsbedürftig. Wichtig ist, die Bindung des Gültigkeitsbereichs an die gesamte Funktion zu verinnerlichen und das Anheben von Variablendeklarationen zu berücksichtigen. Beides lässt sich auf einfache Art umsetzen, indem der Entwickler sich angewöhnt, sämtliche Variablendeklarationen – anders als eventuell von einer C-Sprache gewohnt – an den Beginn der jeweiligen Funktion zu verschieben. Das vermeidet nicht nur Probleme, sondern entspricht auch der empfohlenen Vorgehensweise für JavaScript.

Anders als häufig behauptet, ist das var-Schlüsselwort nicht optional: Entfällt es, wird anstelle einer Variablen eine Eigenschaft am globalen Objekt erzeugt. Da das in der Regel nicht beabsichtigt ist und zudem ungewollte Seiteneffekte einführt, empfiehlt es sich, niemals eine "Deklaration" ohne var durchzuführen und Code, der das macht, als "falsch" anzusehen. (ane)

Golo Roden
ist freiberuflicher Wissensvermittler und Technologieberater für Webentwicklung, Codequalität und agile Methoden.