Inhaltsverzeichnis
Was ist eine Schließung?
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?
Heim Web-Frontend js-Tutorial Das Konzept des Abschlusses in js

Das Konzept des Abschlusses in js

Jun 19, 2020 am 09:11 AM
javascript 闭包

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: 封闭环境内的变量
Nach dem Login kopieren

Dieses Beispiel ist ein typischer Abschluss. Es gibt mehrere Punkte zu beachten:

  1. showMessage Ja 🎜>Eine createActionFunktion , die nach der Ausführung davon zurückgegeben wurde.
  2. ist eine geschlossene lexikalische Umgebung im Inneren createAction, da eine Variable in dieser gekapselten Umgebung niemals direkt von außen zugänglich ist. message
  3. wird außerhalb von showMessage ausgeführt, aber auf die darin definierte lokale Variable createAction wird während der Ausführung zugegriffen (erfolgreiche Ausgabe). Dies liegt daran, dass die Funktion, auf die durch message verwiesen wird (die anonyme Funktion in showMessage), bei ihrer Definition an die Referenzen (createAction usw.) in der lexikalischen Umgebung (in createAction) gebunden ist, in der sie sich befindet . message
  4. Die an die interne Syntaxumgebung gebundene anonyme Funktion wird durch
  5. zur Verwendung außerhalb der geschlossenen return-Umgebung gebracht, die einen Abschluss bildet. Wenn es innerhalb von createAction aufgerufen wird, gilt es nicht als Abschluss. createAction
Okay, ich glaube, 1, 2 und 4 sind alle leicht zu verstehen, aber es kann etwas schwierig sein, den wichtigsten Punkt 3 zu verstehen – die Schwierigkeit besteht darin, dass dies nichts ist, was Programmierer tun entscheiden kann.

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

Lokal definierte Funktionen herausbringen

Wir haben bereits erwähnt, dass wir lokal definierte Funktionen durch

herausbringen können. return

Die Funktion ist hier zu einem „Gut“ geworden, nicht anders als andere Güter (Variablen). Solange es eine Möglichkeit gibt, Variablen herauszunehmen, gibt es eine Möglichkeit, Funktionen herauszunehmen. Verwenden Sie zum Beispiel ein „Container“-Objekt:

function encase(aCase) {
    const dog = "狗狗";
    const cat = "猫猫";
    aCase.show = function () {
        console.log(dog, cat);
    };
}

const myCase = {};
encase(myCase);
myCase.show();      // output: 猫猫 狗狗
Nach dem Login kopieren
Fällt Ihnen etwas ein?

Module und Verschlüsse

Ja, Exporte und module.exports. In dem von CJS (CommonJS) definierten Modul können Sie

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

ESM (ECMAScript-Modul) verwendet die Syntax

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. returnexportEs 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() { }
Nach dem Login kopieren

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 为什么会有一个随机后缀没?
Nach dem Login kopieren

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
Nach dem Login kopieren

Wenn Sie überrascht sind, definieren Sie

auf andere Weise, um zu sehen, ob es leichter zu verstehen ist:

function create() {
    closure = function() { }
    return closure;
}
Nach dem Login kopieren
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
}
Nach dem Login kopieren

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.

functionAlso, um es zusammenzufassen:

Ein Abschluss besteht aus einer Funktion und verschiedenen Ressourcen (Referenzen) in der geschlossenen Umgebung, in der er definiert ist. Jeder Abschluss ist einzigartig, weil Die Umgebungsressourcen, die den Abschluss bilden, sind unterschiedlich (unterschiedliche lokale Umgebungen, unterschiedliche definierte lokale Variablen, unterschiedliche übergebene Parameter usw.).

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Was bedeutet der Abschluss im C++-Lambda-Ausdruck? Apr 17, 2024 pm 06:15 PM

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.

Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Wie implementiert man einen Abschluss im C++-Lambda-Ausdruck? Jun 01, 2024 pm 05:50 PM

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.

Was sind die Vor- und Nachteile von Abschlüssen in C++-Funktionen? Was sind die Vor- und Nachteile von Abschlüssen in C++-Funktionen? Apr 25, 2024 pm 01:33 PM

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.

Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Lösen Sie das durch Schließungen verursachte Speicherverlustproblem Feb 18, 2024 pm 03:20 PM

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

Der Einfluss von Funktionszeigern und -abschlüssen auf die Golang-Leistung Der Einfluss von Funktionszeigern und -abschlüssen auf die Golang-Leistung Apr 15, 2024 am 10:36 AM

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.

Die Rolle des Golang-Funktionsschlusses beim Testen Die Rolle des Golang-Funktionsschlusses beim Testen Apr 24, 2024 am 08:54 AM

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.

Verkettete Aufrufe und Schließungen von PHP-Funktionen Verkettete Aufrufe und Schließungen von PHP-Funktionen Apr 13, 2024 am 11:18 AM

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.

Wie werden Schließungen in Java implementiert? Wie werden Schließungen in Java implementiert? May 03, 2024 pm 12:48 PM

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.

See all articles