TLDR
Eine Schließung ist eine Verbindung zwischen einer Funktion und ihrer äußeren lexikalischen (d.h. wie geschrieben) Umgebung, so dass die in dieser Umgebung definierten Bezeichner (Variablen, Parameter, Funktionsdeklarationen usw.) von der Funktion aus sichtbar sind, unabhängig davon, wann oder von wo aus die Funktion aufgerufen wird.
Detalles
In der Terminologie der ECMAScript-Spezifikation kann man sagen, dass eine Schließung durch die [[Environment]]
Referenz eines jeden Funktionsobjekts, die auf den lexikalische Umgebung innerhalb derer die Funktion definiert ist.
Wenn eine Funktion über die interne [[Call]]
Methode, die [[Environment]]
Referenz auf das Funktionsobjekt wird in die Hinweis auf die äußere Umgebung de la Umwelt-Datensatz der neugeschaffenen Ausführungskontext (Stapelrahmen).
Im folgenden Beispiel wird die Funktion f
schließt über die lexikalische Umgebung des globalen Ausführungskontexts:
function f() {}
Im folgenden Beispiel wird die Funktion h
schließt sich über die lexikalische Umgebung der Funktion g
der wiederum die lexikalische Umgebung des globalen Ausführungskontexts abschließt.
function g() {
function h() {}
}
Wenn eine innere Funktion von einer äußeren Funktion zurückgegeben wird, bleibt die äußere lexikalische Umgebung bestehen, nachdem die äußere Funktion zurückgekehrt ist. Dies liegt daran, dass die äußere lexikalische Umgebung verfügbar sein muss, wenn die innere Funktion schließlich aufgerufen wird.
Im folgenden Beispiel wird die Funktion j
schließt sich über die lexikalische Umgebung der Funktion i
, was bedeutet, dass die Variable x
ist von innerhalb der Funktion sichtbar j
, lange nach der Funktion i
die Ausführung abgeschlossen hat:
function i() {
var x = 'mochacchino'
return function j() {
console.log('Printing the value of x, from within function j: ', x)
}
}
const k = i()
setTimeout(k, 500) // invoke k (which is j) after 500ms
In einer Schließung werden die Variablen in der äußeren lexikalischen Umgebung selbst sind verfügbar, no Kopien.
function l() {
var y = 'vanilla';
return {
setY: function(value) {
y = value;
},
logY: function(value) {
console.log('The value of y is: ', y);
}
}
}
const o = l()
o.logY() // The value of y is: vanilla
o.setY('chocolate')
o.logY() // The value of y is: chocolate
Die Kette der lexikalischen Umgebungen, die zwischen den Ausführungskontexten über äußere Umgebungsreferenzen verbunden sind, bildet eine Umfangskette und definiert die Bezeichner, die von einer bestimmten Funktion aus sichtbar sind.
Bitte beachten Sie, dass diese Antwort in dem Bemühen um Klarheit und Genauigkeit gegenüber dem Original erheblich geändert wurde.