JavaScript/Bezeichner
An vielen Stellen in JavaScript müssen Sie selbst Namen vergeben, zum Beispiel für selbst definierte Funktionen, eigene Objekte oder Variablen. Diese werden Bezeichner genannt.
Bei selbst vergebenen Namen gelten folgende Regeln:
- sie dürfen keine Leerzeichen enthalten
- sie dürfen nur aus Buchstaben und Ziffern bestehen - das erste Zeichen muss ein Buchstabe sein; es sind Groß- und Kleinbuchstaben erlaubt. Groß- und Kleinschreibung werden unterschieden!
- sie dürfen keine deutschen Umlaute oder scharfes S enthalten
- sie dürfen als einziges Sonderzeichen den Unterstrich "_" enthalten
- sie dürfen nicht mit einem reservierten Wort identisch sein.
Es dürfen ruhig auch deutschsprachige Wörter sein, solange die genannten Regeln eingehalten werden.
Inhaltsverzeichnis
Reservierte Wörter
Es gibt eine Reihe von reservierten Wörtern (Reserved Words), die nicht als Name für einen Bezeichner verwendet werden dürfen. Andernfalls wird ein Syntaxfehler erzeugt, der die Ausführung des Programms verhindert. Es ist deshalb bei der Vergabe von Bezeichnern, etwa für Funktionen oder Variablen, stets darauf zu achten, dass es sich bei dem gewählten Namen nicht um ein reserviertes Wort handelt.
// Syntax Error
function break() {
return null;
}
Wird wie bei der Funktionsdeklaration in dem Beispiel oben ein reserviertes Wort als Name für den Bezeichner gewählt, in diesem Fall also das Schlüsselwort break, dann wird das Programm erst gar nicht ausgeführt. Diese Funktion macht ihrem Namen also alle Ehre. Es sind allerdings in Bezug auf die reservierten Wörter einige Besonderheiten zu beachten, die nicht unbedingt sofort ersichtlich sind.
const object = {
delete(property) {
return delete this[property];
}
};
object.default = 'value';
console.info(object.delete('default')); // true
So sind die Namen von Objekteigenschaften und Methoden (Property Names) zum Beispiel grundsätzlich keine Bezeichner im Sinne der Sprache, weshalb das Verbot der Verwendung reservierter Wörter hier nicht einschlägig ist. Dabei spielt es auch keine Rolle, ob eine Eigenschaft oder Methode in einem Objektliteral definiert wird oder nicht, weshalb in dem Beispiel oben durch die Verwendung der Schlüsselwörter delete und default als Eigenschafts- beziehungsweise Methodenname kein Fehler erzeugt wird.
let public = 'valid';
// Syntax Error
function test() {
'use strict';
const static = 'invalid';
}
Darüber hinaus ist zu beachten, dass manche Wörter nur im Strict Mode reserviert sind. So erzeugt etwa die Verwendung des Namens public als Bezeichner bei der Variablendeklaration in dem Beispiel oben keinen Fehler, da der globale Kontext im normalen Modus ausgeführt wird. Weil die Funktion test jedoch im Strict Mode ausgeführt werden soll und in ihr eine Konstante deklariert wird, deren Name in diesem Modus reserviert ist, wird hier dennoch ein Syntaxfehler erzeugt.
<script>
let await = 'Godot';
</script>
Schließlich kann der Status als reserviertes Wort auch davon abhängen, ob der auszuführende Code Teil eines Scripts oder Teil eines Moduls ist. Wird etwa, wie in dem Beispiel oben, eine Variable innerhalb eines Scripts deklariert und dabei der Bezeichner await verwendet, dann ist das kein Problem. Jedoch würde es sich anders verhalten, wenn die Deklaration innerhalb eines Moduls vorgenommen worden wäre, denn dort wäre der Name await reserviert.
Schlüsselwörter
Bei den meisten reservierten Wörtern handelt es sich um Schlüsselwörter der Sprache (Keywords), also um Wörter, die eine bestimmte Bedeutung haben. So wie beispielsweise das Wort function, das zur Definition einer Funktion verwendet werden kann. Die folgende Tabelle zeigt alle reservierten Wörter, bei denen es sich um solche Schlüsselwörter handelt und die unabhängig vom Ausführungsmodus des Programms geschützt sind, also nicht als Name für Bezeichner verwendet werden dürfen.
Reserviertes Wort | Erläuterung |
---|---|
as | -Alias beim Export von Modulen, bzw. deren Inhalten |
break | Teil einer Abbruchanweisung. Wird verwendet in Schleifen und bei switch. |
case | Für Fallunterscheidungen mit switch. |
catch | Wird bei der Fehlerbehandlung mit try und catch verwendet. |
class | Für die Definition einer Klasse (ES6). |
const | Leitet die Deklaration einer oder mehrerer Konstanten ein. |
continue | Teil einer Fortsetzungsanweisung. |
debugger | Definiert einen Haltepunkt im Programm für Debugger. |
default | Standardklausel bei switch. Auch verwendet bei Standardexport in einem Modul. |
delete | Operator zum Löschen von Objekteigenschaften. |
do | Für Schleifen mit do und while. |
else | Teil einer bedingten Anweisung mit if. |
export | Wird bei der Deklaration eines Exports in einem Modul verwendet. |
extends | Mit dem Schlüsselwort extends kann eine abgeleitete Klasse definiert werden. |
finally | Kann bei der Fehlerbehandlung mit try und catch verwendet werden. |
for | Wird in verschiedenen Schleifen verwendet. |
function | Schlüsselwort zur Definition einer Funktion. |
if | Für bedingte Anweisungen. |
import | Wird verwendet bei der Deklaration eines Imports aus einem Modul. |
in | Operator in einem relationalen Ausdruck. Auch verwendet in einer Schleife mit for. |
instanceof | Hiermit kann geprüft werden, ob ein Objekt eine Instanz eines Konstruktors ist. |
new | Operator für den Konstruktorenaufruf. |
return | Teil der Rückgabeanweisung einer Funktion. |
super | Schlüsselwort zum Methoden- oder Konstruktorenaufruf in Objekt oder abgeleiteter Klasse. |
switch | Für Fallunterscheidungen. |
this | Eingebaute Kontextvariable von Funktionen. |
throw | Erzeugt eine benutzerdefinierte Ausnahme. |
try | Wird bei der Fehlerbehandlung mit try und catch verwendet. |
typeof | Operator, der den Datentyp des Operanden zurückgibt. |
var | Schlüsselwort für die Deklaration einer oder mehrerer Variablen. |
void | Wertet den Ausdruck auf der rechten Seite aus und gibt standardmäßig undefined zurück. |
while | Wird bei Schleifen verwendet. |
with | wurde früher verwendet, um mehrere Anweisungen mit einem Objekt durchzuführen. |
yield | Pausiert die Ausführung einer Generatorfunktion. |
Darüber hinaus gibt es noch zwei Schlüsselwörter, die nur im Strict Mode reserviert sind, deren Verwendung also nur in diesem Ausführungsmodus einen Syntaxfehler produziert. Es ist allerdings davon abzuraten, diese Wörter als Name für einen Bezeichner zu verwenden, auch wenn dies im normalen Ausführungsmodus grundsätzlich möglich wäre, da hierbei die Lesbarkeit und damit auch die Wartbarkeit des Codes beeinträchtigt wird.
Reserviertes Wort | Erläuterung |
---|---|
let
|
Leitet die Deklaration einer oder mehrerer Variablen ein. |
static
|
Wird verwendet um innerhalb einer Klasse eine eigene Methode zu definieren. |
Konstanten
Weiterhin gibt es in JavaScript einige eingebaute Konstanten (Literals), bei denen es sich ebenfalls um reservierte Wörter handelt und deren Gebrauch entsprechend eine Ausnahme produziert, nämlich die primitiven Werte vom Datentyp Boolean und Null. Bei dem primitiven Wert undefined
handelt es sich hingegen nicht um ein reserviertes Wort, weder im normalen noch im strikten Ausführungsmodus. Allerdings ist auch hier von der Verwendung als Name für einen Bezeichner abzuraten.
Reserviertes Wort | Erläuterung |
---|---|
null
|
Repräsentiert die beabsichtigte Abwesenheit eines Wertes. |
false
|
Boolescher Wert, der für falsch steht. |
true
|
Boolescher Wert, der für wahr steht. |
Für die Zukunft reservierte Wörter
Schließlich gibt es noch einige für die zukünftige Entwicklung der Sprache reservierte Wörter (Future Reserved Words), die ebenfalls nicht in Bezeichnernamen verwendet werden sollten. Aber auch hier sind einige Eigenheiten zu beachten. So erzeugt die Verwendung des für die Zukunft reservierten Wortes enum
grundsätzlich einen Syntaxfehler, während das Wort await
wie in der Einleitung bereits gesehen nur dann geschützt ist, wenn es im Code eines Moduls verwendet wird.
implements
interface
package
private
protected
public
Die oben aufgelisteten Wörter sind nur dann reserviert, wenn das Programm im Strict Mode ausgeführt wird. Jedoch gilt auch hier, dass von der Verwendung diese Wörter als Namen für Bezeichner von Variablen, Konstanten oder Funktionen abzuraten ist, selbst wenn das im normalen Modus möglich wäre.
Weblinks
ECMAScript 2017 (7th Edition, ECMA-262 Draft): Reserved Words
ECMAScript 2015 (6th Edition, ECMA-262): Reserved Words
MDN: Keywords