Back

JavaScript-Variablendeklarationen: var, let und const verstehen

JavaScript-Variablendeklarationen: var, let und const verstehen

Moderne JavaScript-Entwicklung erfordert Klarheit bei JavaScript-Variablendeklarationen – dennoch haben viele Entwickler Schwierigkeiten bei der Wahl zwischen var, let und const. Das Verständnis des ES6-Variable-Scope geht nicht nur darum, Regeln auswendig zu lernen; es geht darum, Code zu schreiben, der Absichten kommuniziert und Fehler verhindert, bevor sie auftreten.

Wichtigste Erkenntnisse

  • Block-Scope (let/const) bietet eine bessere Variablenkapselung als Function-Scope (var)
  • Die Temporal Dead Zone verhindert die Verwendung von Variablen vor ihrer Initialisierung
  • const verhindert Neuzuweisungen, aber nicht die Mutation von Objekten und Arrays
  • Modernes JavaScript bevorzugt standardmäßig const, let bei Bedarf und vermeidet var

Die drei Deklarationsschlüsselwörter in JavaScript verstehen

JavaScript bietet drei Möglichkeiten, Variablen zu deklarieren, jede mit unterschiedlichem Verhalten bezüglich Scope, Hoisting und Neuzuweisung. Ihre Wahl signalisiert sowohl der JavaScript-Engine als auch anderen Entwicklern, die Ihren Code lesen, unterschiedliche Absichten.

Block-Scope vs. Function-Scope

Der grundlegende Unterschied zwischen modernem ES6-Variable-Scope und veralteten Mustern liegt darin, wie Variablen gekapselt werden:

function processData() {
    if (true) {
        var x = 1;  // Function-scoped
        let y = 2;  // Block-scoped
        const z = 3; // Block-scoped
    }
    console.log(x); // 1 (accessible)
    console.log(y); // ReferenceError
    console.log(z); // ReferenceError
}

Bei var „entweichen” Variablen aus Blöcken, bleiben aber innerhalb von Funktionen. Sowohl let als auch const respektieren Blockgrenzen – jede geschweifte Klammer erzeugt einen neuen Scope, einschließlich derer in Schleifen, Bedingungen und einfachen Blöcken.

Die Temporal Dead Zone erklärt

JavaScript-Variablendeklarationen mit let und const werden gehoisted, bleiben aber bis zum Erreichen ihrer Deklaration uninitialisiert. Dies erzeugt die Temporal Dead Zone (TDZ):

console.log(myVar);   // undefined (hoisted, initialized)
console.log(myLet);   // ReferenceError (TDZ)
console.log(myConst); // ReferenceError (TDZ)

var myVar = 1;
let myLet = 2;
const myConst = 3;

Die TDZ verhindert die subtilen Fehler, die das Verhalten von var oft verursacht hat. Sie können eine Variable nicht versehentlich verwenden, bevor sie ordnungsgemäß initialisiert wurde – die Engine wirft sofort einen Fehler.

Neuzuweisung vs. Mutation

Eine kritische Unterscheidung, die viele Entwickler übersehen: const verhindert Neuzuweisungen, nicht Mutationen:

const user = { name: 'Alice' };
user.name = 'Bob';          // Allowed (mutation)
user = { name: 'Charlie' }; // TypeError (reassignment)

const scores = [95, 87];
scores.push(91);            // Allowed
scores = [100, 100];        // TypeError

Für echte Unveränderlichkeit kombinieren Sie const mit Object.freeze() oder Immutable-Data-Bibliotheken. Das Deklarationsschlüsselwort allein macht Ihre Daten nicht unveränderlich – es macht die Bindung unveränderlich.

Moderne Best Practices für Variablendeklarationen

JavaScript-Codebasen folgen heute einer klaren Hierarchie:

  1. Standardmäßig const verwenden: Nutzen Sie es für Werte, die nicht neu zugewiesen werden. Dies umfasst die meisten Variablen, auch Objekte und Arrays, die Sie mutieren werden.

  2. let für Neuzuweisungen verwenden: Schleifenzähler, Akkumulatorvariablen und Werte, die wirklich eine Neubindung benötigen.

  3. var in neuem Code vermeiden: Es gibt keinen modernen Anwendungsfall, bei dem var Vorteile gegenüber let bietet.

Moderne Tools erzwingen diese Muster. ESLints no-var-Regel und prefer-const-Regel erkennen Verstöße automatisch. TypeScript behandelt ES6-Variable-Scope-Regeln als grundlegend und macht Block-Scope zum Standard-Denkmodell.

Framework-Überlegungen

React Hooks hängen davon ab, dass sich JavaScript-Variablendeklarationen vorhersehbar verhalten:

function Counter() {
    const [count, setCount] = useState(0); // const for the binding
    
    // Wrong: Can't reassign
    // count = count + 1;
    
    // Right: Use the setter
    setCount(count + 1);
}

Vues Composition API und andere moderne Frameworks folgen ähnlichen Mustern, bei denen const dominiert, weil Reaktivitätssysteme Updates über Methoden handhaben, nicht über Neuzuweisungen.

Warum Legacy-Code noch var verwendet

Sie werden in älteren Codebasen aus historischen Gründen auf var stoßen. Vor ES6 (2015) war es die einzige Option. Die Migration erfordert sorgfältige Tests, weil:

  • Das Ändern von var zu let in Schleifen kann Fehler beheben oder einführen, abhängig vom Closure-Verhalten
  • Einiger Legacy-Code nutzt bewusst das Function-Scope-Hoisting von var aus
  • Ältere Build-Tools transpilieren ES6-Variable-Scope möglicherweise nicht korrekt

Verwenden Sie beim Refactoring automatisierte Tools wie jscodeshift mit umfassender Testabdeckung. Konvertieren Sie nicht manuell Tausende von Deklarationen – lassen Sie Tools die mechanischen Änderungen vornehmen, während Sie das Verhalten verifizieren.

Fazit

JavaScript-Variablendeklarationen in modernem Code folgen einer einfachen Regel: Verwenden Sie standardmäßig const, let wenn Sie Neuzuweisungen benötigen, und niemals var. Es geht nicht darum, Trends zu folgen – es geht darum, Code zu schreiben, der Absichten klar ausdrückt und ES6-Variable-Scope nutzt, um ganze Kategorien von Fehlern zu verhindern. Die Temporal Dead Zone, Block-Scoping und Neuzuweisungsregeln sind keine Hindernisse – sie sind Leitplanken, die Sie zu wartbarerem JavaScript führen.

FAQs

Ja, const verhindert nur die Neuzuweisung der Variable selbst, nicht die Änderung der Inhalte. Sie können Eigenschaften in Objekten und Elemente in Arrays, die mit const deklariert wurden, hinzufügen, entfernen oder ändern. Die Variable zeigt immer auf dasselbe Objekt oder Array im Speicher.

Sie erhalten einen ReferenceError aufgrund der Temporal Dead Zone. Anders als var, das undefined zurückgibt, wenn vor der Deklaration darauf zugegriffen wird, existieren let- und const-Variablen in einem uninitialisierten Zustand, bis der Code ihre Deklarationszeile erreicht.

Nur mit sorgfältigen Tests. Obwohl generell vorteilhaft, kann das Ändern von var zu let in Schleifen das Closure-Verhalten verändern. Verwenden Sie automatisierte Refactoring-Tools mit umfassender Testabdeckung statt manueller Änderungen, um die Einführung von Fehlern zu vermeiden.

Complete picture for complete understanding

Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.

Check our GitHub repo and join the thousands of developers in our community.

OpenReplay