Hallo Hugo,
du möchtest mehr über den Unterschied zwischen statischem und dynamischen Scope lernen.
Bei statischem bzw. lexikalischem Scope sind in einer Funktion nur die Variablen sichtbar, die in ihrer lexikalischen Umgebung definiert wurden, also in den umgebenden Gültigkeitsbereichen. Es ist also schon vor der Laufzeit nur durch Ansicht des Quellcodes zu erkennen, welche Variable wo sichtbar ist.
let x = 3;
function f() {
console.log(x + y);
}
function g() {
let y = 2;
function h() {
console.log(x + y);
}
f();
h();
}
g();
Die globale Variable x
ist in der lexikalischen Umgebung sowohl der Funktion f
als auch der Funktionen g
und h
und deshalb in allen Funktionen sichtbar.
Die Variable y
ist hingegen nur innerhalb der Funktion g
sichtbar und in h
, weil der lokale Gültigkeitsbereich von g
die Funktion h
umgibt. Innerhalb von f
ist die Variable hingegen nicht sichtbar, da die Umgebung aus der Sicht von f
nur aus dem globalen Gültigkeitsbereich besteht.
Dass f
aus g
heraus aufgerufen wird ist nicht von Belang. Bei lexikalischem Scope kommt es nur auf den Ort der Definition einer Funktion an, nicht auf den Ort an dem sie aufgerufen wird.
Bei dynamischem Scope ist das anders. Hier spielt es für die Sichtbarkeit von Variablen tatsächlich eine Rolle, welche Funktionen in welcher Reihenfolge aufgerufen wurden.
my $*x = 10;
sub f {
my $*x = 20;
g();
}
sub g {
say $*x += 10;
}
Das Perl-Beispiel habe ich aus diesem Beitrag entnommen.
Auch hier wird eine globale und eine lokale Variable definiert, so wie zwei Funktionen im globalen Scope. Würden hier die Regeln für lexikalischen Scope gelten, dann müsste die Funktion g
die globale Variable x
referenzieren und nach der Addition 20 ausgeben.
Hier gelten jedoch die Regeln für dynamischen Scope, weshalb bei der Auflösung des Bezeichners x
in der Funktion g
nicht zuerst in der lexikalischen Umgebung, also dem globalen Scope, sondern im lokalen Gültigkeitsbereich der aufrufenden Funktion f
gesucht wird.
Dort wird eine Variable x
gefunden und deshalb der Wert 30 ausgegeben.
JavaScript verwendet lexikalischen Scope. Deshalb ist die Variable zaehler
nur innerhalb der anonymen Funktion sichtbar, die von ersteFunktion
zurückgegeben wird.
Viele Grüße