Das Konzept des Abschlusses in js
Verschlüsse gibt es nicht nur bei JavaScript, die meisten Hochsprachen verfügen über diese Fähigkeit.
Was ist eine Schließung?
Ein Abschluss ist die Kombination einer gebündelten (eingeschlossenen) Funktion mit Verweisen auf ihren umgebenden Zustand (die lexikalische Umgebung).
dies Segment ist die Definition eines Abschlusses auf MDN, der wie folgt verstanden wird: Eine Funktion und ihre umgebenden Referenzen in der geschlossenen lexikalischen Umgebung bilden einen Abschluss. Vielleicht ist dieser Satz immer noch schwer zu verstehen:
function createAction() { var message = "封闭环境内的变量"; return function() { console.log(message); } } const showMessage = createAction(); showMessage(); // output: 封闭环境内的变量
Dieses Beispiel ist ein typischer Abschluss. Es gibt mehrere Punkte zu beachten:
-
showMessage
Ja 🎜>EinecreateAction
Funktion , die nach der Ausführung davon zurückgegeben wurde. - ist eine geschlossene lexikalische Umgebung im Inneren
createAction
, da eine Variable in dieser gekapselten Umgebung niemals direkt von außen zugänglich ist.message
- wird außerhalb von
showMessage
ausgeführt, aber auf die darin definierte lokale VariablecreateAction
wird während der Ausführung zugegriffen (erfolgreiche Ausgabe). Dies liegt daran, dass die Funktion, auf die durchmessage
verwiesen wird (die anonyme Funktion inshowMessage
), bei ihrer Definition an die Referenzen (createAction
usw.) in der lexikalischen Umgebung (increateAction
) gebunden ist, in der sie sich befindet .message
Die an die interne Syntaxumgebung gebundene anonyme Funktion wird durch - zur Verwendung außerhalb der geschlossenen
return
-Umgebung gebracht, die einen Abschluss bildet. Wenn es innerhalb voncreateAction
aufgerufen wird, gilt es nicht als Abschluss.createAction
Denken Sie also nicht, dass „Sie“ den Abschluss erstellt haben, denn Abschlüsse sind eine Sprachfunktion, Sie haben diese Funktion einfach ausgenutzt .
Wenn die Sprache keine Abschlüsse unterstützt, ähnlich wie im obigen Code, wird die Variable bei der Ausführung von showMessage
nicht gefunden. Ich möchte vor allem ein Beispiel finden, aber leider scheinen alle mir bekannten Hochsprachen Abschlüsse zu unterstützen, solange Funktionen innerhalb von Funktionen/Methoden definiert werden können. message
herausbringen können. return
function encase(aCase) { const dog = "狗狗"; const cat = "猫猫"; aCase.show = function () { console.log(dog, cat); }; } const myCase = {}; encase(myCase); myCase.show(); // output: 猫猫 狗狗
verwenden, um Waren einzeln zu bringen, oder Sie können exports.something
verwenden, um Waren zu verpacken, aber egal was passiert, module.exports = ...
ist derjenige, der Waren bringt, aber Möglicherweise wurde das ursprünglich arrangierte exports
durch eines unserer eigenen exports
ersetzt. exports
und import
, was nur eine weitere Möglichkeit ist, Waren hervorzubringen. Der einzige Unterschied besteht darin, dass export
Sie können nur eins mitbringen (es sei denn, es ist verpackt), return
Sie können ein Bündel mitbringen. return
export
Es sollte auch hinzugefügt werden, dass das Modul unabhängig davon, ob es sich um CJS oder ESM handelt, eine gekapselte Umgebung ist und die darin definierten Dinge für außen nicht zugänglich sind, solange sie nicht herausgenommen werden. Dies unterscheidet sich von der standardmäßigen globalen Umgebung von Webskripten. Bitte beachten Sie den Unterschied.
Wenn es im Code ausgedrückt wird, ist das wahrscheinlich das, was ich gedacht habe, als ich das Modul definiert habe:
const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { }
In der laufenden Umgebung sieht es tatsächlich so aus (Hinweis: nur zur Veranschaulichung):
// module factory function createModule_18abk2(exports, module) { const var1 = "我是一个顶层变量吧"; function maybeATopFunction() { } } // ... 遥远的生产线上,有这样的示意代码 const module = { exports: {} }; const m18abk2 = createModule_18abk2(module) ?? module; // 想明白 createModule_18abk2 为什么会有一个随机后缀没?
Ist es immer noch die gleiche Funktion?
Wenn du zu weit gehst, bring es zurück. Denken Sie über eine Frage nach: Theoretisch ist eine Funktion ein statischer Codeblock. Wird die Abschlussfunktion zurückgegeben, indem die äußere Funktion mehrmals aufgerufen wird?
Versuchen Sie es mit:
function create() { function closure() { } return closure; } const a = create(); const b = create(); console.log(a === b); // false
Wenn Sie überrascht sind, definieren Sie
auf andere Weise, um zu sehen, ob es leichter zu verstehen ist:function create() { closure = function() { } return closure; }
closure()
Wenn Sie es noch können' Ich verstehe es nicht, versuche es noch einmal. Schau dir das an: function create() { const a = function () { }; const b = function () { }; console.log(a === b); // false }
Verstehst du? Jedes Mal, wenn
eine neue Funktion definiert. Die Funktion ist neu und der Name ist nicht wichtig – Sie können sie Xiao Ming nennen, aber andere können sie auch Xiao Ming nennen.function
Also, um es zusammenzufassen:
Abschluss, dieses Mal habe ich es herausgefunden!
Empfohlenes Tutorial: „JS-Tutorial
Das obige ist der detaillierte Inhalt vonDas Konzept des Abschlusses in js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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.
