HTMLCSSJavaScriptIndexRoadmapImpressum

Scope und Hoisting

Scope und Hoisting erklären, wo Variablen gültig sind und warum manches in JavaScript auch „vor“ der Zeile zu funktionieren scheint, in der du es deklarierst. Wenn du das verstehst, vermeidest du typische Fehler mit let, const und var.

Was ist Scope?

Der Scope (Gültigkeitsbereich) legt fest, an welchen Stellen im Code du auf eine Variable zugreifen darfst. Liegt eine Variable außerhalb ihres Scopes, kannst du sie nicht lesen oder ändern – JavaScript meldet dann einen Fehler.

Globaler Scope

Variablen, die du außerhalb von Funktionen und Blöcken anlegst, gehören zum globalen Scope. Du kannst sie überall im Skript verwenden – auch innerhalb von Funktionen.

Globaler Scope

1let name = "Anna";
2
3function begruessung() {
4    console.log("Hallo " + name);
5}
6
7begruessung();
8console.log(name);

Output

Hallo Anna

Anna

name ist global: Die Funktion und der Code außerhalb greifen beide darauf zu.

Funktions-Scope

Variablen, die du innerhalb einer Funktion deklarierst, gelten nur dort. Außerhalb der Funktion existieren sie nicht.

Funktions-Scope

1function zeigeNachricht() {
2    let text = "Nur hier sichtbar";
3    console.log(text);
4}
5
6zeigeNachricht();
7// console.log(text); // Fehler: text ist nicht definiert

Output

Nur hier sichtbar

So bleiben lokale Variablen „privat“ und überschreiben nicht aus Versehen globale Namen.

Block-Scope mit let und const

Ein Block ist alles zwischen geschweiften Klammern { } – zum Beispiel bei if, for oder while. Mit let und const gilt eine Variable nur innerhalb dieses Blocks.

Block-Scope

1if (true) {
2    let innen = "im Block";
3    const auchInnen = "auch im Block";
4    console.log(innen);
5    console.log(auchInnen);
6}
7
8// console.log(innen); // Fehler
9// console.log(auchInnen); // Fehler

Output

im Block

auch im Block

var verhält sich anders: Es kennt keinen Block-Scope, sondern nur Funktions- bzw. globalen Scope.

var kennt keinen Block-Scope

1if (true) {
2    var alt = "mit var";
3}
4
5console.log(alt); // funktioniert – var kennt keinen Block-Scope

Output

mit var

Deshalb empfiehlt sich in neuem Code let und const – der Gültigkeitsbereich ist klarer und vorhersehbarer.

Was ist Hoisting?

Hoisting bedeutet, dass JavaScript Deklarationen beim Ausführen „nach oben“ im aktuellen Scope verschiebt – du kannst eine Funktion also oft schon aufrufen, bevor sie im Code steht. Bei Variablen ist das Verhalten je nach Schlüsselwort unterschiedlich.

Funktionsdeklarationen

Klassische function-Deklarationen werden vollständig gehoisted. Du darfst sie vor ihrer Definition aufrufen:

Funktions-Hoisting

1sageHallo();
2
3function sageHallo() {
4    console.log("Hallo!");
5}

Output

Hallo!

var wird gehoisted

Bei var wird die Deklaration nach oben geholt, die Zuweisung aber nicht. Vor der Zuweisung ist der Wert undefined:

Hoisting mit var

1console.log(zahl);
2var zahl = 10;

Output

undefined

Unterschied: var, let und const

let und const werden technisch auch „gehoisted“, liegen aber in der sogenannten Temporal Dead Zone: Du darfst sie nicht verwenden, bevor die Zeile mit der Deklaration ausgeführt wurde.

let vor der Deklaration

1// console.log(alter); // Fehler: Cannot access before initialization
2let alter = 25;
3console.log(alter);

Output

25

  • var: Funktions-/globaler Scope, vor der Zuweisung undefined
  • let / const: Block-Scope, Zugriff erst nach der Deklaration
  • Praxis: Nutze const und let, vermeide var

Im nächsten Kapitel lernst du: Grundlagen von Events