Was genau bedeutet „closure“ beziehen sich auf in JavaScript?
-
05-07-2019 - |
Frage
Ich verstehe, was Verschlüsse sind, aber ich einige Probleme habe grokking genau das, was der Begriff closure
bezeichnet. Ich habe den Begriff in vielen Websites verwendet gesehen, aber selten tun sie auf der tatsächlichen Definition zustimmen.
- Ist es die Variablen, die auf dem Stapelrahmen gehalten werden?
- Ist es die Funktion, die zurückgegeben wird?
- Ist es der Umfang der äußeren Funktion?
- Ist es der Umfang der inneren (zurück) Funktion?
- Ist es vielleicht das Konzept der Variablen auf dem Stack-Rahmen zu halten, nachdem die Funktion zurückkehrt?
Kann mir jemand sagen, genau das, was closure
bezieht sich auf?
Lösung
Zwei Ein-Satz-Zusammenfassungen:
Eine Schließung ist die lokalen Variablen für eine Funktion - am Leben gehalten, nachdem die Funktion zurückgekehrt ist, oder
Ein Verschluß ist ein Stapel-Rahmen, ist nicht, wenn die Funktion freigegeben kehrt zurück. (Als ob ein ‚stack-frame‘ waren statt des Seins auf der malloc'ed stapeln!)
Ein sehr guter Artikel über Schließungen
A „Schließung“ ist ein Ausdruck (Typischerweise eine Funktion), die aufweisen freie Variablen zusammen mit einem Umwelt, die diese Variablen bindet (Das "schließt" den Ausdruck).
Die einfache Erklärung eines Verschlusses ist dass ECMAScript ermöglicht Innen Funktionen; Funktionsdefinitionen und Funktion Ausdrücke, die im Inneren sind die Funktionsstellen der anderen Funktionen. Und dass diese inneren Funktionen sind Erlaubt Zugang zu allen lokalen Variablen, Parameter und erklärt Innen Funktionen innerhalb ihrer äußeren Funktion (en). Ein Verschluß wird gebildet, wenn eine dieser inneren Funktionen gemacht zugänglich außerhalb der Funktion in die es enthalten war, so dass es kann nach der Außen Funktion ausgeführt werden ist zurückgekommen. An welcher Stelle es noch hat Zugriff auf die lokalen Variablen, Parameter und innere Funktion Erklärungen ihrer Außen Funktion. Diese lokalen Variablen, Parameter und Funktionsdeklarationen (zunächst) haben die Werte, die sie hatten, als die Außen Funktion zurückgegeben und kann durch die innere Funktion interagierten mit.
Ein gutes Beispiel hier
Andere Tipps
Es ist eine Funktion, die einen Verweis oder Verweis auf etwas in einem anderen Rahmen „hält“. Zum Beispiel:
var myArrayOfFunctions = [];
for(var i = 0; i<3: i++)
{
//Note how the function being defined uses i,
//where i lives in the parent's scope, this creates a closure
myArrayOfFunctions[i] = function(a) { return a + i;}
}
myArrayOfFunctions[0](5); //Prints 8 WTF!
myArrayOfFunctions[1](5); //8 again
myArrayOfFunctions[2](5); //Well, this 8 was expected
Dies geschieht, weil, wenn die Funktionen „geschaffen“ werden, sie den Wert von i nicht kopieren, halten sie einen Verweis auf i, so dass, wenn wir die Funktionen aufrufen, verwenden sie den aktuellen Wert von i, die 3 ist.
Für mich sind die Verschlüsse in JS können Sie folgendes tun.
„A“ in der inneren Funktion zur Verfügung steht, wenn sie „b“ hinzugefügt, obwohl es außerhalb deklariert wird.
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
Für eine extreme Verwendung von JS Schließungen, können Sie einen Blick auf
Soweit ich das beurteilen kann, ist ein Verschluss eine Funktion innerhalb einer anderen Funktion definiert, die die übergeordneten Funktion des Oszilloskops überlebt. Ein gängiges Beispiel ist Rückrufe: In diesem Fall wird die oben function delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
function closure
innerhalb des Körpers delay_message
definiert ist, aber die Funktionsdefinition - sowie die variable msg
der Eltern-Funktion -. Outlive den Umfang des delay_message
Funktionsaufrufes
Betrachten Sie den folgenden Code, der einen Verschluss mit Variablen a und b
erstelltclosure=(function(){
var a=3
var b=5
return function(operation){
return operation(a,b)
}
}())
// The variables a and b are now part of the closure (They are retained even after the outer function returns)
closure(function(x,y){return x+y}) // outputs 8
closure(function(x,y){return x*y}) // outputs 15`
Dieser besondere Verschluss kann nun jede Funktion, die auf den Variablen a und b
arbeitetIm Wesentlichen eine Schließung ist eine Funktion Körper über ihre Kennungen (Variablen) geschlossen innerhalb ihrer lokalen Umgebung.
Ein Verschluß ist ein Funktionswert aus einem verschachtelten Funktionsdeklaration oder Funktionsausdruck erzeugt (d.h. Lambda-Ausdruck), dessen Körper einen oder mehr Verweise auf Variablen in einem äußeren deklarieren (aber nicht global) Rahmen.
Closure bedeutet eine Funktion (äußeree Funktion) enthält, mit einer anderen Funktion (innere Funktion).
Closure wird verwendet, um die Daten zu schützen.
die Verwendung von immer näher in dem Video-Link demostrated bietet unter: