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?

War es hilfreich?

Lösung

JavaScript Closures

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

Javascript Closures

  

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

JavaScript, um Zeit grok Schließungen

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.

hier ist eine grafische Erklärung.

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:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

In diesem Fall wird die oben 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

erstellt
closure=(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

arbeitet

Im 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top