Detaillierte Erklärung von Javascript-Closures und -Anwendungen

Detaillierte Erklärung von Javascript-Closures und -Anwendungen

Vorwort

Javascript-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
2. Closures sind Funktionen und verschachtelte innere Funktionen
3. Funktionen innerhalb von Closures müssen auf Daten im übergeordneten Funktionsumfang verweisen

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>      

Bildbeschreibung hier einfügen

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>

Bildbeschreibung hier einfügen

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ßungsbeispiele

2.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. Abschlusseffekt

3.1 Abschlusseffekt

1) 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ßung

4.1 Benutzerdefinierter Kapselungs-JS-Code

Externer 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. Abschlussproblem

5.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 Speicherlecks

Bei 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:
  • Erweiterte Closures in JavaScript erklärt
  • JavaScript-Closures erklärt
  • JavaScript-Closures erklärt
  • Javascript-Bereich und Abschlussdetails
  • Detaillierte Erläuterung der JavaScript-Closure-Probleme
  • Detaillierte Erläuterung von Beispielen für JS-Closure- und Garbage-Collection-Mechanismen
  • Analyse des JS-Closure-Prinzips und seiner Anwendungsszenarien
  • Detaillierte Erklärung des Prinzips und der Funktion des JavaScript-Closures

<<:  Lösung für das Problem, dass Ubuntu in der virtuellen Maschine keine Verbindung zum Internet herstellen kann

>>:  MySQL Community Server 5.7.19 Installationshandbuch (detailliert)

Artikel empfehlen

So verwenden Sie crontab zum Hinzufügen geplanter Aufgaben in Linux

Vorwort Das Linux-System wird durch den Systemdie...

Lösung zum automatischen Stoppen des MySQL-Dienstes

Dieser Artikel stellt hauptsächlich die Lösung fü...

Drei Möglichkeiten, doppeltes Einfügen von Daten in MySql zu vermeiden

Vorwort Im Falle eines Primärschlüsselkonflikts o...

So reduzieren Sie die Bildgröße mithilfe des mehrstufigen Docker-Builds

In diesem Artikel wird beschrieben, wie Sie die m...

MySQL-Unterabfragen und gruppierte Abfragen

Inhaltsverzeichnis Überblick Unterabfragen Untera...

So verwenden Sie den Vue-Filter

Inhaltsverzeichnis Überblick Filter definieren Ve...

Detaillierte Erklärung, wie Sie den Speicherverbrauch in MySql reduzieren können

Vorwort Standardmäßig initialisiert MySQL einen g...

Vue implementiert eine Wettervorhersagefunktion

In diesem Artikel wird der spezifische Code von V...

Vue + Element UI realisiert Ankerpositionierung

In diesem Artikelbeispiel wird der spezifische Co...

Implementierung der Nginx-Lastverteilung/SSL-Konfiguration

Was ist Lastenausgleich? Wenn ein Domänenname auf...

Regenbogen-Button-Stil erstellt mit CSS3

Ergebnis: Implementierungscode: html <div Klas...

CSS3-Übergang zur Implementierung eines Benachrichtigungsnachrichtenkarussells

Vue-Version, kopiere sie in die Datei und verwend...

Beispielanalyse des Prinzips und der Lösung des MySQL-Gleitreihenfolgeproblems

Dieser Artikel erläutert anhand von Beispielen da...