VorwortJavascript-Closures sind im Lernprozess im Allgemeinen schwer zu verstehen. Dieser Artikel stellt Closures unter den Gesichtspunkten vor, was Closures sind, gängige Closure-Beispiele, Closure-Funktionen, Closure-Anwendungen und Closure-Probleme. Ich hoffe, er kann Ihnen ein tieferes Verständnis vermitteln. Bitte weisen Sie auf etwaige Unangemessenheiten hin. Vielen Dank. 1. Was ist ein Abschluss?Ein Abschluss ist eine verschachtelte innere (untergeordnete) Funktion, die auf Daten im Gültigkeitsbereich der übergeordneten Funktion verweist, wodurch ein Abschluss erstellt wird. Wichtige Erkenntnisse: 1. Zum Generieren von Closures sind verschachtelte Funktionen erforderlich Wenn die oben genannten Bedingungen nicht erfüllt sind, kann kein Abschluss generiert werden. Das folgende Beispiel veranschaulicht dies. 1.1 Abschluss erfüllt bedingten Code<Skript> Funktion Person () { var name='Marschall'; function student(){ //Unterfunktion deklarieren console.log(name);//Verweise auf den Variablennamen im Gültigkeitsbereich der übergeordneten Funktion } } person(); //Funktionsausführung, Abschluss generieren </script> 1.2 Abschlussgenerierungszeit<Skript> Funktion Person () { var name='marshal'; //Wenn js diese Zeile ausführt, wird ein Abschluss generiert function student(){ //Unterfunktion deklarieren console.log(name); //Variablennamen im Gültigkeitsbereich der übergeordneten Funktion referenzieren } student(); //Interne Funktion wird in externer Funktion aufgerufen } person(); //Funktionsausführung, obwohl die Abschlussbedingung erfüllt ist, wird kein Abschluss generiert </script> Zeitpunkt der Abschlussgenerierung: Der Codeblock der verschachtelten Unterfunktion verweist auf die Daten im übergeordneten Funktionsumfang, und der Abschluss wird generiert, wenn der Kontext erstellt wird, bevor die verschachtelte Unterfunktion ausgeführt wird. Oder einfacher ausgedrückt: Wenn die verschachtelte Unterfunktion extern ausgeführt wird, wird in diesem Moment ein Abschluss generiert. <Skript> Funktion Person () { var name='Marschall'; Funktion Student () { console.log(name); //Diese Methode enthält Abschlusscode } wiederkehrender Student; } var p = person ();// Da das Unterfunktionsobjekt erstellt wird, wird zu diesem Zeitpunkt der erste Abschluss generiert und der Unterfunktionsstudent wird an p zurückgegeben. Da p nicht verschwindet, wird der von der Unterfunktion referenzierte Variablenname im Speicher gespeichert, bis p = null zurückgesetzt wird p ();// Führe den Abschlusscodeblock der Unterfunktion aus und gib "marhsal" aus. p(); //Führe den Closure-Codeblock der Unterfunktion zum zweiten Mal aus und gib „marhsal“ aus. person(); //Die zweite Unterfunktion wird erstellt, um das Objekt aufzurufen. Zu diesem Zeitpunkt wird der zweite Abschluss generiert, aber der Codeblock der Unterfunktion „Student“ wird nicht ausgeführt. </script> 2. Häufige Schließungsbeispiele2.1 Als Argument übergebene Unterfunktion<Skript> Funktion setTimeoutTest(Nachricht,Zeit){ setzeTimeout(Funktion(){ alert(message); //Die verschachtelte untergeordnete Funktion verweist auf die Variable message der übergeordneten Funktion und generiert einen Abschluss }, time); } setTimeoutTest('Eingabeaufforderung',1000); </Skript> 2.2 Zählernutzung (Funktionsrückgabe)<Skript> Funktion zählen(){ var i=1; Funktion add(){ ich++; konsole.log(i); } zurückgeben hinzufügen; } var c=count();//Produktionsabschluss c();//2 c();//3 c();//4 </Skript> 3. Abschlusseffekt3.1 Abschlusseffekt1) Die untergeordnete Funktion verweist auf die Variablen oder Funktionen der übergeordneten Funktion und der Lebenszyklus wird verlängert 2) Seine Variablen oder Funktionen existieren immer und auf die Werte innerhalb der Funktion kann von außen zugegriffen werden <Skript> Funktion zählen(){ var i=1; Funktion add(){ ich++; konsole.log(i); } zurückgeben hinzufügen; } var c=Anzahl(); c();//2 c(); //3 i's Lebenszyklus wird verlängert </script> 4. Antrag auf Schließung4.1 Benutzerdefinierter Kapselungs-JS-CodeExterner JS-Code out.js implementiert Selbstinkrement und Selbstdekrement (Funktion count(){ var i=1; Funktion add(){ ich++; konsole.log(i); } Funktion subtrahieren(){ ich-- konsole.log(i); } Fenster.Anzahl={ hinzufügen: hinzufügen, subtrahieren:subtrahieren } })(); Referenzieren Sie den out.js-Code <script src=out.js></script> <Skript> zählen.add(); //2 zählen.subtrahieren(); //1 zählen.subtrahieren(); //0 </Skript> 5. Abschlussproblem5.1 Verschlüsse und dies<Skript> var name="marshal"; //Globale Variablen erstellen var person={ Name:"leo", getName:function(){ //Gibt anonyme Funktion zurück return function(){ //Gibt this.name zurück return this.name; //Gibt Zeichenfolge zurück } } }; alert(person.getName()()); // Ausgabe-Marshal, interne Funktionen können nicht direkt auf die externe Funktion zugreifen. </Skript> Problemumgehung <Skript> var name="Marschall"; var Person = { Name:"leo", getName:Funktion(){ var that=this; //Speichere dies in einer anderen Variable, auf die der Abschluss zugreifen kann return function(){ gib diesen Namen zurück; } } }; alert(person.getName()()); //das zeigt auf die Person, nicht auf das Fenster </Skript> 5.2 SpeicherlecksBei der Verwendung von Closures ist die abhängige Variable immer vorhanden und das Objekt muss dereferenziert und auf null gesetzt werden, um sicherzustellen, dass sein Speicher bei Bedarf zurückgefordert werden kann. Dies ist das Ende dieses Artikels mit der ausführlichen Erklärung von Javascript-Closures und -Anwendungen. Weitere relevante JS-Closures und -Anwendungen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: MySQL Community Server 5.7.19 Installationshandbuch (detailliert)
Vorwort Das Linux-System wird durch den Systemdie...
Dieser Artikel stellt hauptsächlich die Lösung fü...
Vorwort Im Falle eines Primärschlüsselkonflikts o...
In diesem Artikel wird beschrieben, wie Sie die m...
Inhaltsverzeichnis Überblick Unterabfragen Untera...
Inhaltsverzeichnis Überblick Filter definieren Ve...
Vorwort Standardmäßig initialisiert MySQL einen g...
Verwenden Sie ein Profil, um langsames SQL zu ana...
Wenn der img src-Wert leer ist, werden zwei Anfrag...
In diesem Artikel wird der spezifische Code von V...
In diesem Artikelbeispiel wird der spezifische Co...
Was ist Lastenausgleich? Wenn ein Domänenname auf...
Ergebnis: Implementierungscode: html <div Klas...
Vue-Version, kopiere sie in die Datei und verwend...
Dieser Artikel erläutert anhand von Beispielen da...