Sébastien TIMONER
Experte für Webentwicklung und technisches Teammanagement, ich spezialisiere mich auf die Erstellung und Optimierung leistungsstarker digitaler Lösungen. Mit fundierter Expertise in modernen Technologien wie React.js, Node.js, TypeScript, Symfony, Docker und FrankenPHP stelle ich den Erfolg komplexer SaaS-Projekte von der Konzeption bis zur Produktion für Unternehmen verschiedener Branchen sicher.
Hallo, du JavaScript-Entwickler, der sich die Haare über diese Variablen rauft! Fragst du dich, wann du var, let oder const verwenden sollst, ohne dich in Teambesprechungen zu blamieren? Bleib dran, wir werden das gemeinsam ruhig und mit einem Lächeln klären. Auf dem Programm: Wir erkunden jedes Schlüsselwort, vergleichen ihre Scopes (global, Funktion, Block), lachen ein bisschen über Hoisting (diesen etwas magischen JavaScript-Mechanismus), werfen praktische Beispiele ein und beenden mit einem Hauch von TypeScript. Bereit? Los geht's!
Beginnen wir mit var, dem Ältesten der JavaScript-Variablen. Wenn JavaScript eine TV-Serie wäre, wäre var dieser Old-School-Charakter, unberechenbar aber liebenswert. Bis ES5 war es alles, was wir hatten, um unsere Variablen zu deklarieren. Du kannst es heute noch verwenden, aber Vorsicht: Es hat einige Eigenheiten, die dich überraschen könnten.
var x = 1; var x = 2;
löst keinen Fehler aus – JavaScript überschreibt einfach den ersten Wert mit dem zweiten. Praktisch für Legacy-Code, aber eine Quelle der Verwirrung, die in neuem Code vermieden werden sollte.Um den übermäßig breiten Scope von var zu veranschaulichen, hier ein kleines Beispiel:
javascript
Ja, obwohl dieses fruit innerhalb einer if-Anweisung deklariert wurde, zeigt der console.log außerhalb des Blocks es ohne Probleme an. var kümmert sich nicht um Block-Grenzen: Es ist entweder global oder an seine enthaltende Funktion gebunden, Punkt.
Und das Beste (oder Schlimmste) zum Schluss: Hoisting. Auf Deutsch nennen wir es manchmal "Anheben", aber seien wir ehrlich, wir verwenden meistens den Begriff Hoisting. Es ist vars Tendenz, sich leise am Anfang des Scopes zu deklarieren. JavaScript verhält sich während der Ausführung so, als würden alle var-Deklarationen an den Anfang der Funktion "angehoben". Dadurch kannst du deine Variable vor ihrer Deklarationszeile verwenden... mit einem etwas seltsamen Standardwert. Schauen wir uns das im Hoisting-Abschnitt genauer an (Spoiler: var überrascht dich gerne mit undefined).
Zusammenfassend hat var uns gute Dienste geleistet, aber es ist etwas hinterhältig an den Rändern: breiter Scope, stille Neudeklaration, unberechenbares Hoisting... Wir können es besser machen, und zum Glück hat ES6 neue Schlüsselwörter eingeführt, um Ordnung in das Chaos zu bringen!
2015 begrüßte JavaScript let (zusammen mit const). Und da bekamen wir ein kleines Variablen-Makeover. let ist wie das coole, disziplinierte Kind: Es behebt die meisten Eigenheiten von var und bleibt dabei flexibel.
let x = 1; let x = 2;
im selben Block zu machen, bekommst du einen schönen SyntaxError: Identifier 'x' has already been declared
. Das vermeidet viel Verwirrung, gib es zu.Um den Scope-Unterschied zu var deutlich zu sehen, vergleichen wir mit dem vorherigen Beispiel, indem wir var durch let ersetzen:
javascript
Mit let, sobald du aus den geschweiften Klammern der if-Anweisung heraus bist, ist es das, die vegetable-Variable ist nicht mehr definiert. Versuche, sie zu loggen, und bam: ReferenceError. Das ist let, das gutes Scoping-Verhalten durchsetzt.
Und was ist mit Hoisting? let-Variablen (und const) werden auch gehoistet, aber anders. Sie sind nicht verwendbar, bevor sie deklariert wurden. Technisch weiß die JS-Engine, dass sie im Block existieren (sie reserviert den Speicher), aber bis die Deklarationszeile ausgeführt wird, löst jeder Zugriffsversuch einen Fehler aus. Wir sagen, diese Variablen sind in der Temporal Dead Zone (ja, es klingt wie ein Horrorfilm, aber es ist nur der schicke Name für "vor der Initialisierung nicht zugänglich"). Wir werden dieses Verhalten später genauer besprechen, aber merk dir, dass let dich nicht wild eine Variable zu früh verwenden lässt.
In der Praxis ist let zur Standardwahl für Variablen geworden, die sich im Laufe der Zeit ändern werden. Es bringt Klarheit (Block-Scope) und Sicherheit (keine versehentliche Neudeklaration, kein Zugriff vor der Deklaration). Kurz gesagt, let ist dein neuer Freund für die Deklaration temporärer oder veränderbarer Variablen.
Jetzt zu const! Zur gleichen Zeit wie let eingeführt, erstellt dieses Schlüsselwort Konstanten... oder fast. Sagen wir, es erstellt Variablen, deren Referenz sich nicht ändern wird. const hat denselben Block-Scope wie let (keine mehr herumwandernden vars) und dieselben Hoisting-Regeln (Temporal Dead Zone bis zur Deklaration). Der große Unterschied ist, dass die Variable nach der Initialisierung nicht neu zugewiesen werden kann.
const x;
allein funktioniert nicht (direkter SyntaxError). Du musst zum Beispiel const x = 42;
machen.Schau dir dieses kleine Beispiel an, um den Unterschied zu einer veränderbaren Variable deutlich zu sehen:
javascript
Wir definieren PI als konstant, wir können es ohne Bedenken verwenden, solange wir nicht versuchen, es zu ändern. Wenn wir versuchen, PI = 3.15 zu machen, stoppt uns JavaScript kalt: Keine Änderung einer Konstante.
Hinweis: Konstant bedeutet nicht 100% unveränderlich. Wenn der Wert ein Objekt oder ein Array ist, kannst du immer noch das Innere des Objekts/Arrays ändern. Was sich nicht bewegt, ist die Variable selbst (die Speicherreferenz). Zum Beispiel:
javascript
Hier konnten wir name im user-Objekt trotz const ändern. Allerdings ist eine vollständige Neuzuweisung von user zu einem anderen Objekt verboten. Also, const = konstant, nicht veränderbar, aber nur auf der Variablenebene selbst. Verwechsle nicht Variablenkonstanz mit Wertunveränderlichkeit.
javascript
Bei einem Array ist es die gleiche Logik: Wir können seinen Inhalt ändern (Elemente hinzufügen, löschen, modifizieren), weil wir nur das Innere des Arrays ändern. Aber wir können die fruits-Variable nicht einem neuen Array neu zuweisen. Es ist, als wäre das Array eine Box: Wir können ändern, was drin ist, aber wir können die Box selbst nicht ersetzen.
In der Praxis ist const ideal für alle Werte, die sich nicht ändern sollten: zum Beispiel eine Konfiguration, eine Referenz etc. Es wird häufig verwendet und macht Code robuster (wir wissen, dass diese Variable sich nicht bewegen wird). Tatsächlich empfehlen Best Practices oft, const standardmäßig zu verwenden und nur zu let zu wechseln, wenn wir wissen, dass der Wert sich ändern muss. Was var betrifft... nun, außer in speziellen Fällen vergessen wir es 😉.
Lass uns mehr über Scope sprechen. Scope bestimmt, "wo" eine Variable in deinem Code zugänglich ist. Es gibt hauptsächlich drei Scope-Ebenen in JavaScript:
Zusammenfassend: var ist auf die Funktion (oder global) beschränkt, während let und const auf den aktuellen Block beschränkt sind. Dieser Unterschied löst viele klassische Fallstricke. Zum Beispiel:
javascript
Hier lässt die Schleife mit var i außen hängen, mit seinem Endwert 3. Die Schleife mit let hingegen räumt j beim Verlassen auf: unmöglich, danach darauf zuzugreifen. In der Praxis bedeutet das, dass du mehrere let-Variablen mit demselben Namen in verschiedenen Blöcken ohne Interferenz haben kannst, wo ein einzelnes var zwischen all diesen Blöcken geteilt worden wäre.
Kommen wir zu Hoisting, diesem Deklarations-Anhebungsmechanismus. Es ist oft eine Quelle der Verwirrung (und Witze in Besprechungen), also lass uns das klären. Hoisting ist, wenn die JavaScript-Engine Variablen- und Funktionsdeklarationen während der Ausführung an den Anfang ihres Scopes "verschiebt". In Wirklichkeit wird in deinem Code nichts wirklich verschoben, es ist nur so, dass JavaScript den Speicher für deine Variablen im Voraus allokiert, bevor es Schritt für Schritt ausführt.
Lass uns einen kleinen Hoisting-Test in der Praxis machen:
javascript
Zum Zeitpunkt des ersten console.log wurde die myVar-Variable tatsächlich über Hoisting im Speicher erstellt, aber ihr Standardwert ist undefined (da wir sie noch nicht zugewiesen haben). Kein Fehler, nur undefined wird angezeigt. Dann weisen wir "Hallo" zu, und beim zweiten Mal bekommen wir den erwarteten Wert.
Jetzt schauen wir uns das mit let an:
javascript
Hier löst der erste console.log einen ReferenceError aus. Warum? Weil myLet ohne Initialisierung gehoistet wird. Es ist in seiner Temporal Dead Zone, unzugänglich. JavaScript weigert sich, uns einen Wert zu geben, der noch nicht wirklich existiert. Sobald wir let myLet = "Hallo";
ausführen, kommt die Variable aus ihrer Dead Zone und bekommt "Hallo". Der zweite console.log funktioniert dann perfekt.
Wir können es deutlich sehen: var verhält sich wie ein Ninja, indem es seine Deklaration nach oben hebt und sich leise den Wert undefined gibt, während let/const auf Nummer sicher gehen und jede Verwendung verhindern, bis sie initialisiert sind. Moral der Geschichte: Vermeide es, Code zu schreiben, der sich auf Hoisting verlässt, es ist ein Rezept für Gehirnknoten (und unerwartete undefineds). Besser, deine Variablen am Anfang ihrer Scopes zu deklarieren und deinen Code klar zu halten. Wenn du es vergisst, wird dich das Verhalten von let/const mit einem Fehler daran erinnern, wo var dich mit einem undefined hätte herumstochern lassen.
Ah, und während wir dabei sind, beachte, dass klassisch deklarierte Funktionen (function myFunction() \{ ... \}
) auch vollständig gehoistet werden. Du kannst eine Funktion aufrufen, die später in deinem Code deklariert ist, JavaScript wird sie bereits kennen. Aber Vorsicht, Pfeilfunktionen oder Funktionsausdrücke, die Variablen zugewiesen werden, folgen den Hoisting-Regeln von var/let entsprechend dem verwendeten Schlüsselwort (ein Thema für einen anderen Tag 😉).
Bevor wir uns verabschieden, lass uns kurz über TypeScript sprechen. Wenn du anfängst, TypeScript zu verwenden (das Super-Set von JavaScript, das statische Typisierung hinzufügt), wirst du unsere drei Freunde var, let und const wiederfinden. Gute Nachricht: Ihre Scope- und Hoisting-Verhalten bleiben genau gleich wie in purem JavaScript, da TypeScript in Standard-JavaScript kompiliert wird. Allerdings bringt TypeScript seine persönliche Note zur Typisierung, und das ist einen Blick wert, besonders für let und const.
let fruit = "Apfel";
schreibst, wird TypeScript ableiten, dass fruit vom Typ string ist. Wenn du let age = 25;
schreibst, wird es verstehen, dass age eine Zahl ist, etc. Für let bleibt es ziemlich breit: Die Variable kann sich ändern, also ist der Typ der grundlegende (string, number, etc.).typescript
Die color-Variable ist vom Typ "rot" und nicht nur string. Vorteil? Wenn dein Code später genau den Wert "rot" oder "blau" erwartet (zum Beispiel ein Parameter, der nur einer dieser Farben sein kann), und du const color = "rot"
hast, kannst du ihn ohne Bedenken übergeben. Mit einem let color = "rot"
(breiter String-Typ) hätte TypeScript sich beschwert, weil "rot" nur eine Möglichkeit unter allen Strings ist. Kurz gesagt, const in TypeScript ermöglicht ultra-präzise Typisierung, wenn es nützlich ist. Es ist wie ein Bonus, der das Konzept der Konstante weiter verstärkt.
console.log(myVar); var myVar = 3;
schreibst, wird es signalisieren, dass du ein Scope- oder Ordnungsproblem hast. Dasselbe für ein zu früh verwendetes let, TS kennt die Hoisting-Regeln und wird dich (soweit möglich) vor Fehlern schützen.Zusammenfassend ändert TypeScript die grundlegenden Regeln von var/let/const nicht, aber es verstärkt sie mit dem Sicherheitsnetz der Typisierung. Du gewinnst an Klarheit und fängst Fehler früher. Merk dir besonders, dass const in TypeScript doppelt gewinnt: eine nicht neu zuzuweisende Variable und ein präziser Literaltyp – was willst du mehr?
Wir haben alles abgedeckt, also wer ist der Gewinner im var vs let vs const Match? Keine große Überraschung: 2025 gewinnt das let & const Duo haushoch für das Schreiben von sauberem und wartbarem Code. Hier ist eine würzige Zusammenfassung praktischer Ratschläge:
Da hast du es, du weißt jetzt, wann du var, let oder const in JavaScript verwenden sollst, und sogar ein bisschen, wie es mit TypeScript funktioniert. Keine Verwirrung mehr über unsere drei Begleiter oder Spott in der Code-Review, weil du ein var ohne gültigen Grund aus dem Hut gezogen hast. Geh friedlich coden, und vergiss nicht: const so oft wie möglich, let wenn nötig, und var... so wenig wie möglich! Happy Coding!