Der Gültigkeitsbereich (Scope) bestimmt, wo eine Variable sichtbar ist.
Arten von Scope
| Scope | Gilt in | Erzeugt durch |
|---|---|---|
| global | im ganzen Programm | Deklaration außerhalb von allem |
| Funktion | in der Funktion | function |
| Block | zwischen { } | let, const in if, for usw. |
| Modul | in der Datei | ES-Module |
Ergebnis
überall nur hier nur im Block ReferenceError ReferenceError
Innere Bereiche sehen äußere Variablen, nicht umgekehrt. Findet JavaScript einen Namen nicht im aktuellen Bereich, sucht es nach außen weiter (Scope-Kette).
Verdecken (Shadowing)
Ergebnis
innen außen
Globale Variablen vermeiden
Globale Variablen kann überall jemand ändern. Halte Daten so lokal wie möglich.
Closures
Eine Closure entsteht, wenn eine innere Funktion Variablen der äußeren Funktion "mitnimmt", auch nachdem die äußere längst fertig ist:
Ergebnis
1 2 3 1
stand ist von außen nicht erreichbar, nur über die zurückgegebene Funktion. Jeder Aufruf von zaehlerErstellen erzeugt einen eigenen stand. Closures dienen als private Variablen.
Praktisch: Funktionen mit Gedächtnis
Ergebnis
initialisiere 42 42 rechne 9 81 81
Die berühmte Schleifenfalle mit var
Ergebnis
[ 3, 3, 3 ] [ 0, 1, 2 ]
Mit var teilen sich alle Funktionen dieselbe Variable i (am Ende 3). Mit let bekommt jeder Durchlauf eine eigene Variable.
Module als Gültigkeitsbereich
Seit ES-Modulen hat jede Datei ihren eigenen Scope; nur was du mit export freigibst, ist außen sichtbar (eigenes Kapitel).
Merke
- Scope-Kette: Von innen nach außen wird nach Namen gesucht
letundconstgelten im Block,varin der Funktion- Eine Closure behält Zugriff auf die Variablen ihrer Entstehung
- Closures erzeugen private Zustände, Caches und Fabriken
- Globale Variablen vermeiden
Aufgabe
Baue mit einer Closure einen Zähler mit den Methoden erhoehen(), verringern() und wert(), dessen Stand von außen nicht direkt veränderbar ist.