Ausführliche Erklärung von Schließungen in Javascript_Grundkenntnisse
Vorwort: Dies ist immer noch ein Einführungsartikel. Es gibt mehrere sehr wichtige Sprachfunktionen in Javascript – Objekte, prototypische Vererbung und Abschlüsse. Unter anderem ist Closing eine neue Sprachfunktion für Programmierer, die die traditionelle statische Sprache C/C verwenden. Dieser Artikel beginnt mit Beispielen, um die Sprachfunktionen von Javascript-Verschlüssen vorzustellen, und kombiniert sie mit einigen ECMAScript-Sprachspezifikationen, um den Lesern ein tieferes Verständnis von Verschlüssen zu ermöglichen.
Hinweis: Bei diesem Artikel handelt es sich um einen Einführungsartikel. Wenn Sie ein Experte sind, können Sie gerne technische Vorschläge und Meinungen zu dem Artikel abgeben. In diesem Artikel geht es um Javascript. Ich möchte keinen Sprachvergleich durchführen. Wenn Sie mit Javascript nicht vertraut sind, machen Sie bitte einen Umweg.
Was ist Schließung?
Was ist eine Schließung? Schließung ist eine neue Funktion, die statische Sprachen nicht haben. Aber der Abschluss ist nicht allzu kompliziert, um ihn zu verstehen. Kurz gesagt, der Abschluss ist:
Ein Abschluss ist eine Sammlung lokaler Variablen einer Funktion, aber diese lokalen Variablen bleiben nach der Rückkehr der Funktion weiterhin bestehen.
Schließung bedeutet, dass der „Stapel“ einer Funktion nach der Rückkehr der Funktion nicht freigegeben wird. Wir können auch verstehen, dass diese Funktionsstapel nicht auf dem Stapel, sondern auf dem Heap zugewiesen werden
Beim Definieren einer anderen Funktion innerhalb einer Funktion wird ein Abschluss generiert
Die obige zweite Definition ist die erste ergänzende Erklärung, die das Subjekt, das Prädikat und das Objekt der ersten Definition extrahiert – der Abschluss ist die Menge der „lokalen Variablen“ der Funktion. Es ist lediglich so, dass nach der Rückkehr der Funktion auf diese lokale Variable zugegriffen werden kann. (Dies ist keine offizielle Definition, aber diese Definition sollte für Sie hilfreicher sein, um Schließungen zu verstehen)
Als lokale Variablen kann der Code innerhalb der Funktion auf sie zugreifen. Dies unterscheidet sich nicht von statischen Sprachen. Der Unterschied zu Abschlüssen besteht darin, dass Code außerhalb der Funktion weiterhin auf lokale Variablen zugreifen kann, nachdem die Funktionsausführung beendet ist. Das bedeutet, dass die Funktion eine „Referenz“ zurückgeben muss, die auf den Abschluss verweist, oder diese „Referenz“ einer externen Variablen zuweisen muss, um sicherzustellen, dass externer Code auf die lokalen Variablen im Abschluss zugreifen kann. Natürlich sollte die Entität, die diese Referenz enthält, ein Objekt sein, da in Javascript mit Ausnahme der Grundtypen alles andere ein Objekt ist. Leider stellt ECMAScript keine relevanten Mitglieder und Methoden für den Zugriff auf lokale Variablen in Abschlüssen bereit. Aber in ECMAScript kann die im Funktionsobjekt definierte innere Funktion (innere Funktion) direkt auf die lokalen Variablen der externen Funktion zugreifen. Durch diesen Mechanismus können wir den Zugriff auf den Abschluss auf folgende Weise vervollständigen.
Funktionsbegrüßung (Name) {
var text = 'Hallo' name; // lokale Variable
// Bei jedem Aufruf wird ein Abschluss generiert und das interne Funktionsobjekt an den Aufrufer zurückgegeben
Rückgabefunktion() { Alert(text); }
var sayHello=greeting("Closure");
sayHello() // Auf die lokale Variable text
wird durch den Abschluss zugegriffen
Das Ausführungsergebnis des obigen Codes lautet: Hallo Abschluss, da die Funktion sayHello() nach Ausführung der Begrüßungsfunktion weiterhin auf den darin definierten lokalen Variablentext zugreifen kann.
Okay, das ist der legendäre Effekt von Verschlüssen. Es gibt verschiedene Anwendungsszenarien und -modi in Javascript, wie z. B. Singleton, Power Constructor und andere Javascript-Modi, die untrennbar mit der Verwendung von Verschlüssen verbunden sind.
ECMAScript-Abschlussmodell
Wie implementiert ECMAScript Verschlüsse? Wer mehr erfahren möchte, kann sich die ECMAScript-Spezifikation zur Recherche besorgen. Ich gebe hier nur eine einfache Erklärung, auch der Inhalt stammt aus dem Internet.
Wenn die Funktion des ECMAscript-Skripts ausgeführt wird, verfügt jede Funktionszuordnung über eine Ausführungskontextszene (Ausführungskontextszene). Diese Ausführungskontextszene enthält drei Teile
Die Lexikalische Umgebung
Die VariableEnvironment
diese Bindung
Der dritte Punkt, diese Bindung, hat nichts mit Schließungen zu tun und wird in diesem Artikel nicht behandelt. Die Grammatikumgebung wird zum Parsen von Variablenbezeichnern verwendet, die während der Funktionsausführung verwendet werden. Wir können uns die Grammatikumgebung als ein Objekt vorstellen, das zwei wichtige Komponenten enthält: Umgebungsdatensatz (Enviroment Recode) und externe Referenz (Zeiger). Der Umgebungsdatensatz enthält lokale Variablen und Parametervariablen, die innerhalb der Funktion deklariert wurden, und externe Referenzen verweisen auf das Kontextausführungsszenario des externen Funktionsobjekts. Der Wert dieser Referenz in der globalen Kontextszene ist NULL. Eine solche Datenstruktur bildet eine einseitig verknüpfte Liste, wobei jede Referenz auf die äußere Kontextszene verweist.
Zum Beispiel sollte das Abschlussmodell unseres obigen Beispiels so aussehen: Die Funktion sayHello befindet sich auf der unteren Ebene, die obere Ebene ist die Begrüßungsfunktion und die äußerste Ebene ist die globale Szene. Wie unten gezeigt: Wenn sayHello aufgerufen wird, findet sayHello den Wert des lokalen Variablentextes über die Kontextszene, sodass im Dialogfeld auf dem Bildschirm die Funktion der Variablenumgebung (VariableEnvironment) angezeigt wird. und die Grammatikumgebung sind grundsätzlich ähnlich. Einzelheiten zu den spezifischen Unterschieden finden Sie im ECMAScript-Spezifikationsdokument.
Beispielsequenz von Verschlüssen
Zuvor habe ich ungefähr verstanden, was Javascript-Abschlüsse sind und wie Abschlüsse in Javascript implementiert werden. Im Folgenden helfen wir Ihnen, Schließungen anhand einiger Beispiele besser zu verstehen. Die folgenden Beispiele stammen von JavaScript-Verschlüssen für Dummies (Spiegel). Beispiel 1: Lokale Variablen in Abschlüssen sind Referenzen und keine Kopien
Funktion say667() {
// Lokale Variable, die innerhalb des Abschlusses landet
var num = 666;
var sayAlert = function() { alarm(num); num ;
Geben Sie sayAlert;
zurück }
var sayAlert = say667();
sayAlert()
Beispiel 2: Mehrere Funktionen binden denselben Abschluss, da sie in derselben Funktion definiert sind.
// Lokale Variable, die innerhalb des Abschlusses landet
var num = 666;
// Einige Referenzen auf Funktionen als globale Variablen speichern
gAlertNumber = function() { alarm(num); gIncreaseNumber = function() { num ; gSetNumber = function(x) { num = x; }
setupSomeGlobals(); // Werte zu drei globalen Variablen zuweisen
gAlertNumber(); //666
gIncreaseNumber();
gAlertNumber(); // 667
gSetNumber(12);//
gAlertNumber();//12
Beispiel 3: Beim Zuweisen von Funktionen in einer Schleife werden diese Funktionen an denselben Abschluss gebunden
Code kopieren
result.push( function() {alert(item ' ' list[i])} );
}
Ergebnis zurückgeben;
}
Funktion testList() {
var fnlist = buildList([1,2,3]);
// j nur verwenden, um Verwirrung zu vermeiden – könnte i verwenden
for (var j = 0; j < fnlist.length; j ) {
fnlist[j]();
}
}
Das Ausführungsergebnis von testList besteht darin, dass das undefinierte Fenster item3 dreimal angezeigt wird, da diese drei Funktionen an denselben Abschluss gebunden sind und der Wert von item das zuletzt berechnete Ergebnis ist. Wenn ich jedoch aus der Schleife springe, Der Wert von i ist 4, also list Das Ergebnis von [4] ist undefiniert.
Beispiel 4: Alle lokalen Variablen der äußeren Funktion liegen innerhalb des Abschlusses, auch wenn diese Variable nach der Definition der inneren Funktion deklariert wird.
Funktion sayAlice() {
var sayAlert = function() { alarm(alice); // Lokale Variable, die innerhalb des Abschlusses landet
var alice = 'Hallo Alice';
Geben Sie sayAlert;
zurück }
var helloAlice=sayAlice();
halloAlice();
Beispiel 5: Erstellen Sie bei jedem Aufruf der Funktion einen neuen Abschluss
// Lokale Variablen, die innerhalb des Abschlusses landen
var num = someNum;
var anArray = [1,2,3];
var ref = someRef;
Rückgabefunktion(x) {
num = x;
anArray.push(num);
alarm('num: ' num
'nanArray ' anArray.toString()
'nref.someVar ' ref.someVar);
}
}
close1=newClosure(40,{someVar:'closure 1'});
close2=newClosure(1000,{someVar:'closure 2'});
Schließung1(5); // num:45 anArray[1,2,3,45] ref:'someVar Schließung1'
Schließung2(-10);// num:990 anArray[1,2,3,990] ref:'someVar Schließung2'
Singleton:
var privateVariable;
Funktion privateFunction(x) {
...privateVariable...
}
Geben Sie {
zurück firstMethod: Funktion (a, b) {
...privateVariable...
},
secondMethod: Funktion (c) {
...privateFunction()...
}
};
}();

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



In C++ ist ein Abschluss ein Lambda-Ausdruck, der auf externe Variablen zugreifen kann. Um einen Abschluss zu erstellen, erfassen Sie die äußere Variable im Lambda-Ausdruck. Abschlüsse bieten Vorteile wie Wiederverwendbarkeit, Ausblenden von Informationen und verzögerte Auswertung. Sie sind in realen Situationen nützlich, beispielsweise bei Ereignishandlern, bei denen der Abschluss auch dann noch auf die äußeren Variablen zugreifen kann, wenn diese zerstört werden.

C++-Lambda-Ausdrücke unterstützen Abschlüsse, die Funktionsbereichsvariablen speichern und sie für Funktionen zugänglich machen. Die Syntax lautet [capture-list](parameters)->return-type{function-body}. Capture-Liste definiert die zu erfassenden Variablen. Sie können [=] verwenden, um alle lokalen Variablen nach Wert zu erfassen, [&], um alle lokalen Variablen nach Referenz zu erfassen, oder [Variable1, Variable2,...], um bestimmte Variablen zu erfassen. Lambda-Ausdrücke können nur auf erfasste Variablen zugreifen, den ursprünglichen Wert jedoch nicht ändern.

Ein Abschluss ist eine verschachtelte Funktion, die auf Variablen im Bereich der äußeren Funktion zugreifen kann. Zu ihren Vorteilen gehören Datenkapselung, Zustandserhaltung und Flexibilität. Zu den Nachteilen gehören der Speicherverbrauch, die Auswirkungen auf die Leistung und die Komplexität des Debuggens. Darüber hinaus können Abschlüsse anonyme Funktionen erstellen und diese als Rückrufe oder Argumente an andere Funktionen übergeben.

Titel: Durch Abschlüsse und Lösungen verursachte Speicherlecks Einführung: Abschlüsse sind ein sehr verbreitetes Konzept in JavaScript, das internen Funktionen den Zugriff auf Variablen externer Funktionen ermöglicht. Allerdings können Schließungen bei falscher Verwendung zu Speicherverlusten führen. In diesem Artikel wird das durch Schließungen verursachte Speicherverlustproblem untersucht und Lösungen sowie spezifische Codebeispiele bereitgestellt. 1. Durch Schließungen verursachte Speicherlecks Das Merkmal von Schließungen besteht darin, dass interne Funktionen auf Variablen externer Funktionen zugreifen können, was bedeutet, dass in Schließungen referenzierte Variablen nicht durch Müll gesammelt werden. Bei unsachgemäßer Verwendung

Die Auswirkungen von Funktionszeigern und -abschlüssen auf die Go-Leistung sind wie folgt: Funktionszeiger: Etwas langsamer als direkte Aufrufe, aber verbessert die Lesbarkeit und Wiederverwendbarkeit. Schließungen: Normalerweise langsamer, kapseln aber Daten und Verhalten. Praktischer Fall: Funktionszeiger können Sortieralgorithmen optimieren und Abschlüsse können Ereignishandler erstellen, aber sie bringen Leistungseinbußen mit sich.

Funktionsabschlüsse der Go-Sprache spielen beim Unit-Testen eine wichtige Rolle: Werte erfassen: Abschlüsse können auf Variablen im äußeren Bereich zugreifen, sodass Testparameter erfasst und in verschachtelten Funktionen wiederverwendet werden können. Vereinfachen Sie den Testcode: Durch die Erfassung von Werten vereinfachen Abschlüsse den Testcode, indem sie die Notwendigkeit beseitigen, Parameter für jede Schleife wiederholt festzulegen. Verbessern Sie die Lesbarkeit: Verwenden Sie Abschlüsse, um die Testlogik zu organisieren und so den Testcode klarer und leichter lesbar zu machen.

Ja, die Einfachheit und Lesbarkeit des Codes können durch verkettete Aufrufe und Abschlüsse optimiert werden: Verkettete Aufrufe verknüpfen Funktionsaufrufe in einer fließenden Schnittstelle. Abschlüsse erstellen wiederverwendbare Codeblöcke und greifen auf Variablen außerhalb von Funktionen zu.

Abschlüsse in Java ermöglichen es inneren Funktionen, auf äußere Bereichsvariablen zuzugreifen, selbst wenn die äußere Funktion beendet wurde. Durch anonyme innere Klassen implementiert, enthält die innere Klasse einen Verweis auf die äußere Klasse und hält die äußeren Variablen aktiv. Schließungen erhöhen die Codeflexibilität, Sie müssen sich jedoch des Risikos von Speicherverlusten bewusst sein, da Verweise auf externe Variablen durch anonyme innere Klassen diese Variablen am Leben halten.
