Variablen sind eine Datenstruktur, die einem Wert einen aussagekräftigen Namen zuweist. Sie können Daten beliebiger Art enthalten.
Der Name einer Variablen wird als Kennzeichnung bezeichnet. Eine gültige Kennung muss folgenden Regeln entsprechen:
- IDs können Unicode-Buchstaben, Dollarzeichen ($), Unterstriche (_), Ziffern (0–9) und sogar einige Unicode-Zeichen enthalten.
- IDs dürfen keine Leerzeichen enthalten, da der Parser Leerzeichen zum Trennen von Eingabeelementen verwendet. Wenn Sie beispielsweise versuchen, eine Variable
my Variable
anstelle vonmyVariable
aufzurufen, sieht der Parser zwei Bezeichner,my
undVariable
, und gibt einen Syntaxfehler („unerwartetes Token: Bezeichner“) aus. Kennungen müssen mit einem Buchstaben, einem Unterstrich (
_
) oder einem Dollarzeichen ($
) beginnen. Sie dürfen nicht mit Ziffern beginnen, um Verwechslungen zwischen Zahlen und Kennungen zu vermeiden:let 1a = true; > Uncaught SyntaxError: Invalid or unexpected token
Wenn in JavaScript Zahlen am Anfang einer Kennung erlaubt wären, wären auch Kennungen zulässig, die nur aus Zahlen bestehen. Dies würde zu Konflikten zwischen Zahlen führen, die als Zahlen und als Kennungen verwendet werden:
let 10 = 20 10 + 5 > ?
Reservierte Wörter, die bereits syntaktisch sinnvoll sind, können nicht als Bezeichner verwendet werden.
Kennungen dürfen keine Sonderzeichen (
! . , / \ + - * =
) enthalten.
Die folgenden Punkte sind keine strengen Regeln für das Erstellen von IDs, sondern Best Practices aus der Branche, die die Pflege Ihres Codes erleichtern. Wenn für Ihr Projekt andere Standards gelten, folgen Sie diesen für Einheitlichkeit.
Gemäß dem Beispiel der integrierten Methoden und Eigenschaften von JavaScript ist Camel Case (auch als „CamelCase“ geschrieben) eine sehr gängige Konvention für Bezeichner aus mehreren Wörtern. Bei der CamelCase-Schreibung werden alle Wörter außer dem ersten mit einem Großbuchstaben begonnen, um die Lesbarkeit zu verbessern.
let camelCasedIdentifier = true;
In einigen Projekten werden je nach Kontext und Art der Daten andere Namenskonventionen verwendet. Der erste Buchstabe einer Klasse wird beispielsweise in der Regel großgeschrieben. Bei mehrteiligen Klassennamen wird daher häufig eine Variante der Camel Case-Schreibweise verwendet, die auch als „Upper Camel Case“ oder Pascal bezeichnet wird.
class MyClass {
}
IDs sollten die Art der enthaltenen Daten prägnant beschreiben (z. B. ist currentMonthDays
ein besserer Name als theNumberOfDaysInTheCurrentMonth
) und auf einen Blick klar lesbar sein (originalValue
ist besser als val
). Die myVariable
-IDs, die in diesem Modul verwendet werden, funktionieren im Kontext einzelner Beispiele, wären aber im Produktionscode sehr wenig hilfreich, da sie keine Informationen dazu enthalten, welche Daten sie enthalten.
IDs sollten nicht zu spezifisch für die enthaltenen Daten sein, da sich ihre Werte je nach Ausführung der Scripts auf diese Daten oder je nach Entscheidungen zukünftiger Wartungsteams ändern können. Beispielsweise muss eine Variable, die ursprünglich die Kennung miles
hatte, später im Projekt möglicherweise in einen Wert in Kilometern geändert werden. In diesem Fall müssen die Entwickler alle Verweise auf diese Variable ändern, um zukünftige Verwirrung zu vermeiden. Verwenden Sie stattdessen distance
als Kennung, um dies zu vermeiden.
In JavaScript haben Bezeichner, die mit einem Unterstrich (_
) beginnen, keine besonderen Berechtigungen oder Bedeutungen. Sie werden jedoch in der Regel verwendet, um anzugeben, dass eine Variable, Methode oder Eigenschaft „privat“ ist, d. h., dass sie nur im Kontext des enthaltenden Objekts verwendet werden soll und nicht außerhalb dieses Kontexts darauf zugegriffen oder sie nicht geändert werden darf. Diese Konvention stammt aus anderen Programmiersprachen und geht auf die Zeit vor der Einführung der privaten Eigenschaften in JavaScript zurück.
Variablendeklaration
Es gibt mehrere Möglichkeiten, JavaScript auf eine Kennung aufmerksam zu machen. Dieser Vorgang wird als „Deklarieren“ einer Variablen bezeichnet. Eine Variable wird mit den Schlüsselwörtern let
, const
oder var
deklariert.
let myVariable;
Verwenden Sie let
oder var
, um eine Variable zu deklarieren, die jederzeit geändert werden kann. Diese Keywords informieren den JavaScript-Interpreter darüber, dass ein Zeichenstring eine Kennung ist, die einen Wert enthalten kann.
Wenn Sie mit einer modernen Codebasis arbeiten, verwenden Sie let
anstelle von var
. var
funktioniert zwar in modernen Browsern, hat aber einige nicht intuitive Verhaltensweisen, die in den frühesten Versionen von JavaScript definiert wurden und später nicht geändert werden konnten, um die Abwärtskompatibilität zu erhalten. let
wurde in ES6 hinzugefügt, um einige Probleme mit dem Design von var
zu beheben.
Eine deklarierte Variable wird initialisiert, indem ihr ein Wert zugewiesen wird. Verwenden Sie ein einzelnes Gleichheitszeichen (=
), um einer Variablen einen Wert zuzuweisen oder neu zuzuweisen. Sie können dies in derselben Anweisung tun, in der sie deklariert wird:
let myVariable = 5;
myVariable + myVariable
> 10
Sie können eine Variable auch mit let
(oder var
) deklarieren, ohne sie sofort zu initialisieren. In diesem Fall ist der Anfangswert der Variablen undefined
, bis ihr in Ihrem Code ein Wert zugewiesen wird.
let myVariable;
myVariable;
> undefined
myVariable = 5;
myVariable + myVariable
> 10
Eine Variable mit dem Wert undefined
unterscheidet sich von einer nicht definierten Variablen, deren ID noch nicht deklariert wurde. Wenn Sie auf eine Variable verweisen, die Sie nicht deklariert haben, wird ein Fehler ausgegeben.
myVariable
> Uncaught ReferenceError: myVariable is not defined
let myVariable;
myVariable
> undefined
Die Verknüpfung einer Kennung mit einem Wert wird allgemein als „Bindung“ bezeichnet.
Die Syntax, die auf die Keywords let
, var
oder const
folgt, wird als „Bindungsliste“ bezeichnet. Sie ermöglicht mehrere durch Kommas getrennte Variablendeklarationen, die mit dem erwarteten Semikolon enden. Die folgenden Code-Snippets sind daher funktional identisch:
let firstVariable,
secondVariable,
thirdVariable;
let firstVariable;
let secondVariable;
let thirdVariable;
Für die Neuzuweisung des Werts einer Variablen wird let
(oder var
) nicht verwendet, da JavaScript bereits weiß, dass die Variable vorhanden ist:
let myVariable = true;
myVariable
> true
myVariable = false;
myVariable
> false
Sie können Variablen basierend auf ihren vorhandenen Werten neue Werte zuweisen:
let myVariable = 10;
myVariable
> 10
myVariable = myVariable * myVariable;
myVariable
> 100
Wenn Sie versuchen, eine Variable in einer Produktionsumgebung mit let
neu zu deklarieren, erhalten Sie einen Syntaxfehler:
let myVariable = true;
let myVariable = false;
> Uncaught SyntaxError: redeclaration of let myVariable
Die Entwicklertools von Browsern sind bei der erneuten Deklaration von let
(und class
) toleranter. Daher wird in der Entwicklerkonsole möglicherweise kein Fehler angezeigt.
Um die Kompatibilität mit älteren Browsern zu erhalten, erlaubt var
in jedem Kontext eine unnötige Neudeklarierung ohne Fehler:
var myVariable = true;
var myVariable = false;
myVariable\
> false
const
Mit dem Keyword const
können Sie eine Konstante deklarieren. Das ist eine Variable, die sofort initialisiert werden muss und dann nicht mehr geändert werden kann. Für Konstanten gelten dieselben Regeln wie für Variablen, die mit let
(und var
) deklariert werden:
const myConstant = true;
myConstant
> true
Sie können eine Konstante nicht deklarieren, ohne ihr sofort einen Wert zuzuweisen, da Konstanten nach der Erstellung nicht neu zugewiesen werden können. Eine nicht initialisierte Konstante würde also für immer undefined
bleiben. Wenn Sie versuchen, eine Konstante zu deklarieren, ohne sie zu initialisieren, erhalten Sie einen Syntaxfehler:
const myConstant;
Uncaught SyntaxError: missing = in const declaration
Wenn Sie versuchen, den Wert einer mit const
deklarierten Variablen so zu ändern, wie Sie den Wert einer mit let
(oder var
) deklarierten Variablen ändern würden, führt dies zu einem Typfehler:
const myConstant = true;
myConstant = false;
> Uncaught TypeError: invalid assignment to const 'myConstant'
Wenn jedoch eine Konstante mit einem Objekt verknüpft ist, können die Eigenschaften dieses Objekts geändert werden.
const constantObject = { "firstvalue" : true };
constantObject
> Object { firstvalue: true }
constantObject.secondvalue = false;
constantObject
> Object { firstvalue: true, secondvalue: false }
Eine Konstante, die ein Objekt enthält, ist ein unveränderlicher Verweis auf einen veränderlichen Datenwert. Die Konstante selbst kann nicht geändert werden, aber die Eigenschaften des referenzierten Objekts können geändert, hinzugefügt oder entfernt werden:
const constantObject = { "firstvalue" : true };
constantObject = false
> Uncaught TypeError: invalid assignment to const 'constantObject'
Wenn Sie nicht davon ausgehen, dass eine Variable neu zugewiesen wird, sollten Sie sie zu einer Konstante machen. Wenn Sie const
verwenden, wird Ihr Entwicklungsteam oder die zukünftigen Wartungsmitarbeiter eines Projekts angewiesen, diesen Wert nicht zu ändern, um zu vermeiden, dass die Annahmen Ihres Codes über die Verwendung verletzt werden – z. B., dass eine Variable schließlich anhand eines erwarteten Datentyps ausgewertet wird.
Bereich von Variablen
Der Gültigkeitsbereich einer Variablen ist der Teil eines Scripts, in dem diese Variable verfügbar ist.
Außerhalb des Gültigkeitsbereichs einer Variablen wird sie nicht definiert – nicht als Bezeichner mit einem undefined
-Wert, sondern so, als wäre sie nicht deklariert worden.
Je nachdem, welches Keyword Sie zum Deklarieren einer Variablen verwenden und in welchem Kontext Sie sie definieren, können Sie Variablen auf Blockanweisungen (Blockbereich), einzelne Funktionen (Funktionsbereich) oder die gesamte JavaScript-Anwendung (globaler Bereich) anwenden.
Blockbereich
Alle Variablen, die Sie mit let
oder const
deklarieren, gelten nur für die nächstgelegene enthaltende Blockanweisung. Das bedeutet, dass auf die Variable nur innerhalb dieses Blocks zugegriffen werden kann. Der Versuch, außerhalb des enthaltenden Blocks auf eine Blockvariable zuzugreifen, führt zu demselben Fehler wie der Zugriff auf eine nicht vorhandene Variable:
{
let scopedVariable = true;
console.log( scopedVariable );
}
> true
scopedVariable
> ReferenceError: scopedVariable is not defined
Für JavaScript gilt, dass eine blockbezogene Variable nicht außerhalb des Blocks existiert, in dem sie enthalten ist. Sie können beispielsweise eine Konstante innerhalb eines Blocks deklarieren und dann eine weitere Konstante außerhalb dieses Blocks deklarieren, die dieselbe Kennung verwendet:
{
const myConstant = false;
}
const myConstant = true;
scopedConstant;
> true
Eine deklarierte Variable kann sich zwar nicht in den übergeordneten Block erstrecken, ist aber für alle untergeordneten Blöcke verfügbar:
{
let scopedVariable = true;
{
console.log( scopedVariable );
}
}
> true
Der Wert einer deklarierten Variablen kann innerhalb eines untergeordneten Blocks geändert werden:
{
let scopedVariable = false;
{
scopedVariable = true;
}
console.log( scopedVariable );
}
> true
Eine neue Variable kann innerhalb eines untergeordneten Blocks ohne Fehler mit let
oder const
initialisiert werden, auch wenn sie dieselbe Kennung wie eine Variable in einem übergeordneten Block verwendet:
{
let scopedVariable = false;
{
let scopedVariable = true;
}
console.log( scopedVariable );
}
> false
Funktionsumfang
Variablen, die mit var
deklariert werden, gelten nur für die übergeordnete Funktion (oder den Block zur statischen Initialisierung in einer Klasse).
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
Das ist auch nach dem Aufruf einer Funktion der Fall. Auch wenn die Variable während der Ausführung der Funktion initialisiert wird, ist sie außerhalb des Funktionsumfangs nicht verfügbar:
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
myFunction();
> true
scopedVariable;
> ReferenceError: scopedVariable is not defined
Globaler Geltungsbereich
Eine globale Variable ist in einer gesamten JavaScript-Anwendung verfügbar, in allen Blöcken und Funktionen und für jedes Script auf der Seite.
Das mag zwar eine wünschenswerte Standardeinstellung erscheinen, aber Variablen, auf die jeder Teil einer Anwendung zugreifen und die er ändern kann, können unnötigen Overhead verursachen oder sogar zu Kollisionen mit Variablen an anderer Stelle in einer Anwendung mit derselben Kennung führen. Das gilt für alle JavaScript-Elemente, die beim Rendern einer Seite verwendet werden, einschließlich Bibliotheken von Drittanbietern und Nutzeranalysen. Daher sollten Sie nach Möglichkeit vermeiden, den globalen Gültigkeitsbereich zu verunreinigen.
Alle Variablen, die mit var
außerhalb einer übergeordneten Funktion oder mit let
oder const
außerhalb eines übergeordneten Blocks deklariert werden, sind global:
var functionGlobal = true; // Global
let blockGlobal = true; // Global
{
console.log( blockGlobal );
console.log( functionGlobal );
}
> true
> true
(function() {
console.log( blockGlobal );
console.log( functionGlobal );
}());
> true
> true
Wenn Sie einer Variablen einen Wert zuweisen, ohne sie explizit zu deklarieren (d. h., ohne var
, let
oder const
zum Erstellen zu verwenden), wird sie zum globalen Gültigkeitsbereich erhoben, auch wenn sie innerhalb einer Funktion oder eines Blocks initialisiert wird. Eine Variable, die mit diesem Muster erstellt wird, wird manchmal als „implizite globale Variable“ bezeichnet.
function myFunction() {
globalVariable = "global";
return globalVariable
}
myFunction()\
> "global"
globalVariable\
> "global"
Variable Hebevorrichtung
Variablen- und Funktionsdeklarationen werden an den Anfang ihres Gültigkeitsbereichs verlegt. Das bedeutet, dass der JavaScript-Interpreter jede Variable verarbeitet, die an einer beliebigen Stelle in einem Script deklariert wurde, und sie vor der Ausführung des Scripts in die erste Zeile des umschließenden Gültigkeitsbereichs verschiebt. Das bedeutet, dass auf eine Variable, die mit var
deklariert wurde, verwiesen werden kann, bevor sie deklariert wird, ohne dass ein Fehler auftritt:
hoistedVariable
> undefined
var hoistedVariable;
Da nur die Variablendeklaration gehostet wird, nicht die Initialisierung, werden Variablen, die nicht explizit mit var
, let
oder const
deklariert wurden, nicht vorgeschoben:
unhoistedVariable;
> Uncaught ReferenceError: unhoistedVariable is not defined
unhoistedVariable = true;
Wie bereits erwähnt, wird einer deklarierten, aber nicht initialisierten Variablen der Wert undefined
zugewiesen. Dieses Verhalten gilt auch für verschobene Variablendeklarationen, aber nur für solche, die mit var
deklariert wurden.
hoistedVariable
> undefined
var hoistedVariable = 2 + 2;
hoistedVariable\
> 4
Dieses unintuitive Verhalten ist größtenteils auf Designentscheidungen zurückzuführen, die in den frühesten Versionen von JavaScript getroffen wurden. Es kann nicht geändert werden, ohne das Risiko, dass bestehende Websites nicht mehr funktionieren.
let
und const
beheben dieses Problem, indem stattdessen ein Fehler ausgegeben wird, wenn auf eine Variable zugegriffen wird, bevor sie erstellt wurde:
{
hoistedVariable;
let hoistedVariable;
}
> Uncaught ReferenceError: can't access lexical declaration 'hoistedVariable' before initialization
Dieser Fehler unterscheidet sich vom Fehler „hoistedVariable ist nicht definiert“, der auftreten kann, wenn Sie versuchen, auf eine nicht deklarierte Variable zuzugreifen. Da JavaScript die Variable hochgeschoben hat, weiß es, dass die Variable innerhalb des angegebenen Gültigkeitsbereichs erstellt wird. Anstatt diese Variable vor ihrer Deklarierung mit dem Wert undefined
verfügbar zu machen, gibt der Interpreter jedoch einen Fehler zurück.
Variablen, die mit let
oder const
(oder class
) deklariert werden, befinden sich vom Beginn des umschließenden Blocks bis zum Punkt im Code, an dem die Variable deklariert wird, in einer „temporal dead zone“ (TDZ).
Durch die zeitliche Totzone ist das Verhalten von let
für Autoren intuitiver als das von var
. Sie ist auch für das Design von const
entscheidend. Da Konstanten nicht geändert werden können, kann eine Konstante, die an den Anfang ihres Gültigkeitsbereichs verschoben und mit dem impliziten Wert undefined
versehen wurde, nicht mit einem sinnvollen Wert initialisiert werden.
Wissen testen
Mit welchen Zeichen kann eine Kennung beginnen?
Mit welcher Methode wird eine Variable deklariert, deren Wert jederzeit geändert werden kann?