Am besten ist es, diese Konzepte schrittweise zu erklären:
Variablen
console.log(x);
// undefined
Hier, undefined
ist die Art von JavaScript zu sagen: "Ich habe keine Ahnung, was x
bedeutet".
Variablen sind wie Tags.
Sie können sagen, Tag x
weist auf den Wert hin 42
:
var x = 42;
console.log(x);
// 42
Jetzt weiß JavaScript, was x
bedeutet.
Sie können eine Variable auch neu zuordnen.
Tag erstellen x
auf einen anderen Wert verweisen:
x = 43;
console.log(x);
// 43
Jetzt x
bedeutet etwas anderes.
Umfang
Wenn Sie eine Funktion erstellen, verfügt die Funktion über eine eigene "Box" für Variablen.
function A() {
var x = 42;
}
console.log(x);
// undefined
Von außen kann man nicht sehen, was sich in der Schachtel befindet.
Aber vom Inneren der Box aus kann man sehen, was außerhalb der Box ist:
var x = 42;
function A() {
console.log(x);
}
// 42
Innere Funktion A
haben Sie "scope access" zu x
.
Wenn Sie nun zwei Boxen nebeneinander haben:
function A() {
var x = 42;
}
function B() {
console.log(x);
}
// undefined
Innere Funktion B
haben Sie keinen Zugriff auf Variablen innerhalb der Funktion A
.
Wenn Sie jedoch die Funktion define B
innere Funktion A
:
function A() {
var x = 42;
function B() {
console.log(x);
}
}
// 42
Sie haben jetzt "Zugriffsmöglichkeiten".
Funktionen
In JavaScript führen Sie eine Funktion aus, indem Sie sie aufrufen:
function A() {
console.log(42);
}
Zum Beispiel so:
A();
// 42
Funktionen als Werte
In JavaScript können Sie einen Tag auf eine Funktion verweisen, genau wie auf eine Zahl:
var a = function() {
console.log(42);
};
Variabel a
jetzt eine Funktion bedeutet, können Sie sie ausführen.
a();
// 42
Sie können diese Variable auch weitergeben:
setTimeout(a, 1000);
In einer Sekunde (1000 Millisekunden) wird die Funktion a
verweist, wird aufgerufen:
// 42
Umfang des Abschlusses
Wenn Sie nun Funktionen definieren, haben diese Funktionen Zugriff auf ihre äußeren Bereiche.
Wenn Sie Funktionen als Werte weitergeben, wäre es ärgerlich, wenn dieser Zugriff verloren geht.
In JavaScript behalten Funktionen ihren Zugriff auf Variablen des äußeren Bereichs. Selbst wenn sie weitergereicht werden, um an anderer Stelle ausgeführt zu werden.
var a = function() {
var text = 'Hello!'
var b = function() {
console.log(text);
// inside function `b`, you have access to `text`
};
// but you want to run `b` later, rather than right away
setTimeout(b, 1000);
}
Was geschieht nun?
// 'Hello!'
Oder bedenken Sie dies:
var c;
var a = function() {
var text = 'Hello!'
var b = function() {
console.log(text);
// inside function `b`, you have access to `text`
};
c = b;
}
// now we are out side of function `a`
// call `a` so the code inside `a` runs
a();
// now `c` has a value that is a function
// because what happened when `a` ran
// when you run `c`
c();
// 'Hello!'
Sie können weiterhin auf Variablen im Schließungsbereich zugreifen.
Auch wenn a
ist beendet und Sie führen jetzt c
außerhalb von a
.
Was hier gerade passiert ist, wird als Verschluss ' in JavaScript.