Signatur
Beschreibung
Eine Ausdrucksanweisung (engl. expression statement) entsteht, wenn ein beliebiger JavaScript-Ausdruck als eigenständige Anweisung geschrieben wird — also dort, wo der Sprachstandard eine Anweisung (statement) erwartet. Der Ausdruck wird ausgewertet, sein Rückgabewert jedoch verworfen, sofern er nicht explizit gespeichert oder weitergegeben wird. Am Ende steht üblicherweise ein Semikolon ;, das jedoch durch ASI (Automatic Semicolon Insertion) auch automatisch ergänzt werden kann.
Typische Einsatzfälle für Ausdrucksanweisungen sind:
- Funktionsaufrufe — z. B.
console.log("Hallo");oderelement.remove(); - Zuweisungen — z. B.
x = 42;oderobj.name = "Alice"; - Inkrement/Dekrement — z. B.
i++;oder--count; - Operator mit Seiteneffekten — z. B.
delete obj.key;odervoid someCall();
Nicht jeder Ausdruck darf am Anfang einer Anweisung stehen: Ein Objekt-Literal {} würde als Block geparst, und ein function-Ausdruck am Zeilenanfang als Funktionsdeklaration. In solchen Fällen muss der Ausdruck geklammert werden — z. B. ({ key: value }); — oder per void eingeleitet werden, damit der Parser ihn korrekt als Ausdruck erkennt.
Ausdrucksanweisungen bilden das Rückgrat fast jedes JavaScript-Programms. Das Verständnis des Unterschieds zwischen Ausdruck (hat einen Wert) und Anweisung (hat eine Wirkung) ist fundamental für das Lesen und Schreiben von fehlerfreiem JavaScript-Code.
Beispiele
Häufige Ausdrucksanweisungen im Alltag
// Funktionsaufruf als Anweisung
console.log("Hallo Welt");
// Zuweisung als Anweisung
let x;
x = 10;
// Inkrement
x++;
console.log(x); // 11
// Methode auf einem Objekt aufrufen
const arr = [3, 1, 2];
arr.sort();
console.log(arr); // [1, 2, 3]
// delete-Operator
const obj = { a: 1, b: 2 };
delete obj.a;
console.log(obj); // { b: 2 }
Objekt-Literal korrekt als Ausdrucksanweisung klammern
// FALSCH: Der Parser interpretiert {} als leeren Block, nicht als Objekt
// {} .toString(); // SyntaxError
// RICHTIG: Klammern erzwingen die Auswertung als Ausdruck
({ key: "wert" });
// Praxisfall: IIFE (Immediately Invoked Function Expression)
// Ohne Klammern würde 'function' als Deklaration geparst
(function () {
console.log("IIFE ausgeführt");
})();
// Moderne Alternative: Pfeilfunktion benötigt keine Klammer-Tricks
const result = (() => 42)();
console.log(result); // 42
void als Ausdrucksanweisung — Seiteneffekt ohne Rückgabewert
// void wertet den Ausdruck aus, gibt aber immer undefined zurück
// Nützlich z. B. um einen async-Aufruf als Statement zu starten,
// ohne ein ungenutztes Promise zu hinterlassen
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
void delay(100).then(() => console.log("Nach 100 ms"));
console.log("Sofort");
// Wichtig · Fallstricke
Automatic Semicolon Insertion (ASI): JavaScript fügt in bestimmten Situationen automatisch Semikolons ein. Dies kann zu schwer auffindbaren Fehlern führen, wenn eine Anweisung über mehrere Zeilen geht und mit (, [ oder einem Template-Literal beginnt. Es wird empfohlen, Semikolons explizit zu setzen oder einen konsistenten Codestil mit einem Linter durchzusetzen.
Kein Wert ohne Zuweisung: Der ausgewertete Wert einer Ausdrucksanweisung wird stillschweigend verworfen. Im REPL (z. B. Browser-Konsole) oder bei eval() wird er hingegen als Ergebnis sichtbar. Wer den Wert benötigt, muss ihn einer Variablen zuweisen.
Funktionsdeklaration vs. Funktionsausdruck: function foo() {} am Anfang einer Anweisung ist immer eine Deklaration (mit Hoisting). Um eine anonyme oder benannte Funktion als Ausdruck (ohne Hoisting) zu verwenden, muss sie eingeklammert oder mit einem Operator wie void, ! oder + eingeleitet werden.