Anweisungen und Sequenzen in JavaScript
Eine Anweisung ist ein Text, der einem Computer sagt, was er tun soll. Eine Anweisung verlangt etwas. Sie entspricht einem Befehlssatz des Deutschen.
Bei der Auswertung einer Anweisung tut der Computer das, was die Anweisung von ihm verlangt.
Auswertungsanweisungen
Ein Ausdruck mit einem folgenden Semikolon (zB »console.log( … );«) ist eine Auswertungsanweisung.
- Auswertungsanweisung (Syntaxdiagramm)
.----------. .-.
---->| Ausdruck |---->( ; )---->
'----------' '-'
Bei der Auswertung dieser Anweisung wird der Ausdruck ausgewertet. Der Wert der Anweisung ist der von jener Auswertung ermittelte Wert.
(Das Semikolon wird von der ECMAScript -Spezifikation im Abschnitt 13.5 “Expression Statement ” verlangt.)
Wenn der Computer das tut, was die Anweisung verlangt, dann sagt man auch, daß der Computer die Anweisung auswerte.
In dem folgenden Beispiel findet sich die Anweisung »3;«.
- Auswertung
3;
3
Der Wert der Anweisung ist »3«. Jener Wert wird von den meisten Konsolen auch ausgegeben.
In dem folgenden Beispiel findet sich die Anweisung »console.log( 7 );«.
- Auswertung
console.log( 7 );
7
Bei der Auswertung dieser Anweisung wird der Ausdruck »console.log( 7 )« ausgewertet, was zur Ausgabe von »7« führt.
- Zerlegung einer Auswertungsanweisung
console.log( 7 ) ;
'----------------------------------------------------' '-----------'
Ausdruck Semikolon| |
'--------------------------------------------------------------------------'
Auswertungsanweisung
Wenn man das Semikolon einmal vergessen hat, dann wird es von JavaScript oft automatisch ergänzt. Diese Automatik führt allerdings manchmal auch dazu, daß ein Semikolon ergänzt wird, wo wirklich keines stehen soll und ist daher eher lästig als hilfreich. Die meisten guten Programmierer schreiben alle Semikolons ausdrücklich hin und ignorieren die Möglichkeit, manche Semikolons weglassen zu können. Die automatische Ergänzung von Semikolons in JavaScript war einst gut gemeint, aber sie ist oft eher lästig.
Sequenzen
Ein „Skript “ wird in ECMAScript 2015 15.1 und 13.2 als eine Folge von Anweisungen definiert, die mit einem neuen globalen Objekt beginnt, in dem noch keine Veränderungen durch JavaScript -Auswertungen vorgenommen wurden (ECMAScript 2015 15.1). Um Verwechslungen mit einem vollständigen Skript zu vermeiden, sprechen wir von einer Sequenz, um eine Folge von Anweisungen zu bezeichnen, die als eine Einheit angesehen und eingegeben wird, die aber kein vollständiges Skript sein muß, sondern auch ein Teil eines größeren Skripts sein kann.
Eine Sequenz ist beispielsweise »console.log( 7 ); console.log( 8 );«. Bei der Auswertung einer Sequenz werden ihre Anweisungen in der im Text gegebenen Reihenfolgen zeitlich hintereinander abgearbeitet.
- Auswertung
console.log( 7 ); console.log( 8 );
7
8
undefined
Es erscheint (in einigen Konsolen) nur einmal »undefined«, wenn eine Sequenz zweier Anweisungen ausgewertet wird, die beide »undefined« ergeben. Würde man jede Anweisung einzeln eingeben, so würde zwei Mal »undefined« ausgegeben werden.
Laufzeitfehler
Bestimmte Auswertungen können zu Laufzeitfehlern führen. Hierbei handelt es sich darum, daß die JavaScript -Implementation erkennt, daß sie etwas tun soll, das gemäß den Regeln der Programmiersprache JavaScript zu einem Laufzeitfehler führt. Dann wird eine Fehlermeldung ausgegeben und die Auswertung abgebrochen.
Wenn ein Laufzeitfehler auftritt, werden folgende Anweisungen bei der Auswertung einer Sequenz also nicht mehr ausgewertet.
So bewirkt die Auswertung der folgenden Sequenz nur die Ausgabe von »a«, nicht aber die Ausgabe von »b«.
- Auswertung
console.log( "a" ); roegrwri; console.log( "b" );
a
ReferenceError: roegrwri is not defined
Wenn ein Skript sich also nicht wie gewünscht verhält, so kann die Ursache dafür ein Laufzeitfehler sein. Meldungen von Laufzeitfehlern werden bei manchen JavaScript -Implementationen immer etwas versteckt. Der Programmierer sollte also darauf achten, daß er bei der Ausführung von Programmen immer dorthin schaut, wo solche Fehlermeldungen angezeigt werden – insbesondere, wenn sich ein Programm nicht wie gewünscht verhält.
Die automatische Semikoloneinfügung
In der ECMAScript -Spezifikation 2018 11.9 “Automatic Semicolon Insertion ” wird die automatische Semikoloneinfügung beschrieben, welche in manchen Fällen automatisch ein Semikolon in den Quelltext einfügt, wenn dieser von einer ECMAScript -Implementation ausgeführt wird.
Dies ist die Erklärung dafür, daß das Semikolon »;« in manchen Fällen auch weggelassen werden kann – so beispielsweise wenn eine Ausdruck auf einer Zeile für sich steht, der von der nächsten Zeile nicht fortgesetzt wird.
Die Regeln für die automatische Semikoloneinfügung sind kompliziert, daher zeigen wir hier zunächst nur zwei Beispiele.
- Eingabe
2
3- Interpretation der Eingabe
2; 3;
- Ausgabe
3
(Zur Eingabe in eine Konsole muß hier manchmal Umschalt-Eingabe ⇑ - ↵ nach der »2« verwendet werden.)
Die Ausgabe kann dadurch erklärt werden, daß die Eingabe nach der automatischen Semikoloneinfügung als Folge zweier Ausdrucksanweisungen interpretiert wird.
Im folgenden Beispiel wird kein Semikolon nach der »2« eingefügt, da mit den beiden folgenden Zeilen noch eine Verlängerung des Ausdrucks möglich ist.
- Eingabe
2
-
3- Interpretation der Eingabe
2 - 3;
- Ausgabe
-1
Stilregeln für JavaScript
Um den Komplikation der automatischen Semikoloneinfügung zu entkommen, empfehlen wir, auf ihre Nutzung zu verzichten und alle notwendigen Semikolons immer hinzuschreiben. (Dennoch macht sich selbst dann die automatische Semikoloneinfügung immer noch dadurch bemerkbar, daß sie es verhindert, daß in bestimmten Fällen an Stelle eines Leerzeichen ein Zeilenende verwendet werden kann.)
- Stilregeln für JavaScript
https://github.com/airbnb/javascript
https://airbnb.io/projects/javascript/
http://airbnb.io/javascript/css-in-javascript/
Übungsfragen
? Texte klassifizieren
Geben Sie zu den folgenden Texten jeweils an, ob sie eine Anweisung, ein Ausdruck oder keines von beidem sind.
- »console.log«
- »console.log( 7 )«
- »console.log( 7 );«
- Auswertungsanweisung (Syntaxdiagramm)
.----------. .-.
---->| Ausdruck |---->( ; )---->
'----------' '-'
? Ausgabe vorhersagen
Welche Ausgabe erzeugt die Eigabe der folgenden Zeile in die Konsole?
- Auswertung
console.log( 1 ); 2; console.log( Math.floor( 3 )); Math.floor( 4 ); 5
? Satz
Ergänzen Sie den folgenden Satz durch das Einsetzen einer Form eines Verbes.
- Satz
- Bei der Auswertung der Auswertungsanweisung wird ihr Ausdruck __________.
Zitat *
“But insisting on Java’s class and type declarations, or on a semicolon after each statement when a line ending would do, was out of the question—scripting for most people is about writing short snippets of code, quickly and without fuss ” - Brendan Eich, 2001