Ich habe sie alle schon einmal gelesen, und sie sind alle sehr informativ. Einige kommen der einfachen Erklärung sehr nahe und werden dann komplex oder bleiben abstrakt, was den Zweck verfehlt und eine sehr einfache Anwendung in der realen Welt nicht aufzeigt.
Obwohl man beim Durchkämmen der Beispiele und Erklärungen durch Kommentare und Code eine gute Vorstellung davon bekommt, was Closures sind und was nicht, war ich immer noch unzufrieden mit einer sehr einfachen Illustration, die mir half, den Nutzen von Closures zu verstehen, ohne so komplex zu werden. Meine Frau möchte Programmieren lernen, und ich dachte mir, dass ich in der Lage sein müsste, ihr nicht nur das Was, sondern auch das Warum und das Wie zu zeigen.
Ich bin mir nicht sicher, ob ein Sechsjähriger dies verstehen wird, aber ich denke, dass es einen einfachen Fall in der realen Welt etwas besser veranschaulicht, der tatsächlich nützlich sein könnte und leicht verständlich ist.
Eines der besten (oder am ehesten einfachsten) ist die Nacherzählung des Beispiels von Morris' Closures for Dummies.
Wenn man das "SayHi2Bob"-Konzept noch einen Schritt weiterdenkt, werden die beiden grundlegenden Dinge deutlich, die man beim Lesen aller Antworten herausfinden kann:
- Closures haben Zugriff auf die Variablen der enthaltenen Funktion.
- Closures bleiben in ihrem eigenen Speicherbereich bestehen (und sind daher für alle Arten von Oop-y-Instanziierung nützlich)
Um mir das zu beweisen und zu demonstrieren, habe ich eine kleine Fiedel gebaut:
http://jsfiddle.net/9ZMyr/2/
function sayHello(name) {
var text = 'Hello ' + name; // Local variable
console.log(text);
var sayAlert = function () {
alert(text);
}
return sayAlert;
}
sayHello();
/* This will write 'Hello undefined' to the console (in Chrome anyway),
but will not alert though since it returns a function handle to nothing).
Since no handle or reference is created, I imagine a good js engine would
destroy/dispose of the internal sayAlert function once it completes. */
// Create a handle/reference/instance of sayHello() using the name 'Bob'
sayHelloBob = sayHello('Bob');
sayHelloBob();
// Create another handle or reference to sayHello with a different name
sayHelloGerry = sayHello('Gerry');
sayHelloGerry();
/* Now calling them again demonstrates that each handle or reference contains its own
unique local variable memory space. They remain in memory 'forever'
(or until your computer/browser explode) */
sayHelloBob();
sayHelloGerry();
Dies veranschaulicht die beiden grundlegenden Konzepte, die Sie über Verschlüsse verstehen sollten.
Einfach ausgedrückt, um zu erklären, warum dies nützlich ist, habe ich eine Basisfunktion, auf die ich Verweise oder Handles erstellen kann, die eindeutige Daten enthalten, die innerhalb dieses Speicherverweises bestehen bleiben. Ich muss die Funktion nicht jedes Mal neu schreiben, wenn ich den Namen einer Person sagen möchte. Ich habe diese Routine gekapselt und sie wiederverwendbar gemacht.
Für mich führt dies zumindest zu den grundlegenden Konzepten von Konstruktoren, Oop-Praktiken, Singletons vs. instanziierte Instanzen mit ihren eigenen Daten usw. usw.
Wenn Sie einen Neuling damit beginnen, können Sie zu komplexeren Aufrufen auf der Basis von Objekteigenschaften/Mitgliedern übergehen, und hoffentlich werden die Konzepte übernommen.