Inhaltsverzeichnis
Was ist eine Schließung?
Warum schreibst du das so?
Häufige Fallen
Zusammenfassend
Heim Web-Frontend js-Tutorial Nehmen Sie sich eine Minute Zeit, um JavaScript-Abschlüsse zu verstehen

Nehmen Sie sich eine Minute Zeit, um JavaScript-Abschlüsse zu verstehen

Feb 23, 2017 pm 01:33 PM


Was ist eine Schließung?

Schauen wir uns zunächst einen Code an:

function a(){
    var n = 0;
    function inc() {
        n++;
        console.log(n);
    }
    inc();  
    inc(); 
}
a(); //控制台输出1,再输出2
Nach dem Login kopieren

Es ist ganz einfach. Schauen wir uns noch einmal einen Code an:

function a(){
    var n = 0;
    this.inc = function () {
        n++; 
        console.log(n);
    };
}
var c = new a();
c.inc();    //控制台输出1
c.inc();    //控制台输出2
Nach dem Login kopieren

Es ist ganz einfach.

Was ist Schließung? Das ist Schluss!

Funktionen, die Zugriff auf Variablen im Gültigkeitsbereich einer anderen Funktion haben, sind Abschlüsse. Hier greift die Funktion inc auf die Variable n im Konstruktor a zu, sodass ein Abschluss gebildet wird.

Schauen wir uns noch einmal einen Code an:

function a(){
    var n = 0;
    function inc(){
       n++; 
       console.log(n);
    }
    return inc;
}
var c = a();
c();    //控制台输出1
c();    //控制台输出2
Nach dem Login kopieren

Schauen wir uns an, wie er ausgeführt wird:

var c = couter(), dieser Satz couter() gibt zurück die Funktion inc, dann entspricht dieser Satz var c = inc;

 c(), dieser Satz entspricht inc(); Beachten Sie, dass der Funktionsname nur ein Bezeichner (Zeiger auf die Funktion) ist. und () ist die Ausführungsfunktion.

Die Übersetzung der nächsten drei Sätze lautet: var c = inc(); inc();, unterscheidet sie sich vom ersten Code? NEIN.

Was ist Schließung? Das ist Schluss!

Alle Lehrbuch-Tutorials verwenden gerne den letzten Absatz, um Abschlüsse zu erklären, aber ich denke, das verkompliziert das Problem. Was hier zurückgegeben wird, ist der Funktionsname. Schüler, die die C/C++-Programmierung von Tan Haoqiang nicht gesehen haben, erkennen möglicherweise nicht sofort den Unterschied zwischen der Verwendung von () und nicht. Mit anderen Worten, diese Schreibweise hat ihre eigene Falle. Obwohl diese Schreibweise eleganter ist, möchte ich das Problem dennoch vereinfachen. Schauen Sie sich Code 1 und Code 2 an. Haben Sie immer noch Probleme mit dem Funktionsaufruf?

Warum schreibst du das so?

Wir wissen, dass jede Funktion von js ein kleiner dunkler Raum ist, der externe Informationen erhalten kann, aber die Außenwelt kann den Inhalt im Inneren nicht direkt sehen. Platzieren Sie die Variable n in einem kleinen schwarzen Raum. Es gibt keine andere Möglichkeit, auf die Variable n mit demselben Namen außerhalb der Funktion a zuzugreifen. Dies ist die sogenannte erweiterte „Kapselung“.

Der Grund, warum return verwendet wird, um den Funktionsbezeichner inc zurückzugeben, liegt darin, dass die Funktion inc nicht direkt außerhalb der Funktion a aufgerufen werden kann, sodass return inc mit der Außenseite verknüpft ist. Dies in Code 2 verknüpft auch inc mit draußen. .

Häufige Fallen

Sehen Sie sich das an:

function createFunctions(){
    var result = new Array();
    for (var i=0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
    console.log(funcs[i]());
}
Nach dem Login kopieren

Auf den ersten Blick dachte ich, dass es 0~9 ausgibt, aber Das ist absolut nicht der Fall. Denken Sie darüber nach, 10 10s auszugeben?

Die Falle hier ist: Die Funktion mit () ist die Ausführungsfunktion! Ein einfacher Satz wie var f = function() { Alert(‘Hi’); wird kein Fenster öffnen, nur wenn er von f(); gefolgt wird. Die Übersetzung des obigen Codes lautet:

var result = new Array(), i;
result[0] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
result[1] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
...
result[9] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
i = 10;
funcs = result;
result = null;

console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10
console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10
...
console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10
Nach dem Login kopieren

Warum werden nur Ergebnisse erfasst, nicht aber ich? Weil ich immer noch durch die Funktion referenziert werde. Genau wie in einem Restaurant sind die Teller immer begrenzt, also patrouilliert der Kellner am Tisch, um die leeren Teller einzusammeln, aber wie kann er es wagen, die Teller einzusammeln, auf denen noch Gemüse ist? Wenn Sie das Geschirr auf dem Teller manuell leeren (=null), wird der Teller natürlich mitgenommen. Dies ist der sogenannte Memory-Recycling-Mechanismus.

Was die Frage betrifft, wie der Wert von „i“ noch erhalten werden kann, sollte es tatsächlich keinen Grund zur Sorge geben, nachdem man den Artikel von Anfang an gelesen hat. Sollte nach dem Verzehr nicht ein Stück vom Essen auf dem Teller fehlen?

Zusammenfassend

Ein Abschluss ist eine Funktion, die auf eine Variable einer anderen Funktion verweist. Da auf die Variable verwiesen wird, wird sie nicht recycelt und kann daher zum Kapseln einer privaten Variablen verwendet werden . Dies ist sowohl ein Vorteil als auch ein Nachteil. Unnötige Schließungen erhöhen nur den Speicherverbrauch! Darüber hinaus sollten Sie bei der Verwendung von Abschlüssen auch darauf achten, ob der Wert der Variablen Ihren Anforderungen entspricht, da es sich um eine statische private Variable handelt. Abschlüsse werden normalerweise mit vielen Dingen verwechselt. Nur wenn Sie mehr kontaktieren, können Sie Ihr Verständnis vertiefen. Dies ist nur der Anfang, um über die grundlegenden Dinge zu sprechen.

Das oben Genannte wird eine Minute dauern, um den Inhalt von JavaScript-Abschlüssen zu verstehen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


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.

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.

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.

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

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 kann man Speicherlecks in Abschlüssen effektiv vermeiden? Wie kann man Speicherlecks in Abschlüssen effektiv vermeiden? Jan 13, 2024 pm 12:46 PM

Wie kann man Speicherlecks in Schließungen verhindern? Der Verschluss ist eine der leistungsstärksten Funktionen in JavaScript, die die Verschachtelung von Funktionen und die Kapselung von Daten ermöglicht. Schließungen sind jedoch auch anfällig für Speicherverluste, insbesondere bei asynchronen und Timer-Operationen. In diesem Artikel wird erläutert, wie Speicherlecks bei Abschlüssen verhindert werden, und es werden spezifische Codebeispiele bereitgestellt. Speicherlecks treten normalerweise auf, wenn ein Objekt nicht mehr benötigt wird, der von ihm belegte Speicher jedoch aus irgendeinem Grund nicht freigegeben werden kann. In einem Abschluss, wenn eine Funktion auf externe Variablen und diese Variablen verweist

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.

See all articles