Heim >Web-Frontend >js-Tutorial >Was ist der Unterschied zwischen Java- und JavaScript-Abschlüssen?

Was ist der Unterschied zwischen Java- und JavaScript-Abschlüssen?

醉折花枝作酒筹
醉折花枝作酒筹Original
2021-07-22 14:02:422031Durchsuche

Der Unterschied besteht darin: 1. Der Abschluss von Java ist tatsächlich eine innerhalb einer Funktion definierte Funktion (da es sich um eine untergeordnete Funktion handelt, kann er die internen Variablen der übergeordneten Funktion lesen). 2. Der Abschluss von Java kann eine Methode als Variable verwenden Store hat diese Methode die Möglichkeit, auf freie Variablen der Klasse zuzugreifen.

Was ist der Unterschied zwischen Java- und JavaScript-Abschlüssen?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, JavaScript-Version 1.8.5, Dell G3-Computer.

1. Abschlüsse in Javascript:

1. Umfang von Variablen

Um Abschlüsse zu verstehen, müssen Sie zunächst den speziellen Variablenumfang von Javascript verstehen.

Es gibt zwei Arten von Variablenbereichen: globale Variablen und lokale Variablen.

Das Besondere an der Javascript-Sprache ist, dass globale Variablen direkt innerhalb der Funktion gelesen werden können

 var n=999;
 function f1(){
   alert(n);
 }
  f1(); // 999

Lokale Variablen innerhalb der Funktion können dagegen nicht außerhalb der Funktion gelesen werden.

 function f1(){
   var n=999;
 }
  alert(n); // error

Hier gibt es etwas zu beachten: Wenn Sie Variablen innerhalb einer Funktion deklarieren, müssen Sie den Befehl var verwenden. Wenn Sie es nicht verwenden, deklarieren Sie tatsächlich eine globale Variable!

 function f1(){
   n=999;
 }
  f1();
  alert(n); // 999

2. So lesen Sie lokale Variablen von außen

Aus verschiedenen Gründen müssen wir manchmal lokale Variablen innerhalb einer Funktion abrufen. Dies ist jedoch, wie bereits erwähnt, im Normalfall nicht möglich und kann nur durch Workarounds erreicht werden.

Das heißt, eine Funktion innerhalb der Funktion zu definieren.

  function f1(){
    n=999;
    function f2(){
      alert(n); // 999
    }
 }

Da f2 die lokalen Variablen in f1 lesen kann, können wir seine internen Variablen außerhalb von f1 nicht lesen, solange f2 als Rückgabewert verwendet wird!

  function f1(){
    n=999;
    function f2(){
      alert(n);
   }
   return f2;
 }
 var result=f1();
 result(); // 999

3. Das Konzept der Schließung

Die obige f2-Funktion ist ein Abschluss. Ein Abschluss ist eigentlich eine Funktion, die innerhalb einer Funktion definiert ist (da es sich um eine untergeordnete Funktion handelt, kann sie die internen Variablen der übergeordneten Funktion lesen).

Im Wesentlichen ist der Abschluss eine Brücke, die das Innere einer Funktion mit dem Äußeren der Funktion verbindet.

4. Der Zweck des Abschlusses

1. Sie können die Variablen innerhalb der Funktion lesen

2. Die Werte dieser Variablen (Variablen, auf die durch den Abschluss verwiesen wird) bleiben immer im Speicher.

  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
 }
 var result=f1();
 result(); // 999
 nAdd();
 result(); // 1000

In diesem Code ist das Ergebnis eigentlich die Abschlussfunktion f2. Es wurde zweimal ausgeführt, beim ersten Mal war der Wert 999, beim zweiten Mal war der Wert 1000. Dies beweist, dass die lokale Variable n in der Funktion f1 immer im Speicher gespeichert ist und nach dem Aufruf von f1 nicht automatisch gelöscht wird.

Warum passiert das? Der Grund dafür ist, dass f1 die übergeordnete Funktion von f2 ist und f2 einer globalen Variablen zugewiesen ist, wodurch f2 immer im Speicher bleibt und die Existenz von f2 von f1 abhängt, sodass f1 immer im Speicher ist und nicht gelöscht wird Nach Abschluss des Anrufs wird es vom Garbage-Collection-Mechanismus recycelt.

Ein weiterer bemerkenswerter Punkt in diesem Code ist die Zeile „nAdd=function(){n+=1}“. Erstens wird das Schlüsselwort var nicht vor nAdd verwendet, daher ist nAdd eine globale Variable, keine lokale Variable. Zweitens ist der Wert von nAdd eine anonyme Funktion, und diese anonyme Funktion selbst ist auch ein Abschluss, sodass nAdd einem Setter entspricht, der lokale Variablen innerhalb der Funktion außerhalb der Funktion bearbeiten kann.

5. Wichtige Punkte bei der Verwendung von Abschlüssen

1. Da Abschlüsse dazu führen, dass die Variablen in der Funktion im Speicher gespeichert werden, ist der Speicherverbrauch sehr groß, sodass Abschlüsse nicht missbraucht werden können. 2. Abschlüsse werden Ändern Sie außerhalb der übergeordneten Funktion den Wert der Variablen innerhalb der übergeordneten Funktion.

6. Anwendungsszenarien von Abschlüssen

1. Schützen Sie die Variablen innerhalb der Funktion. Nehmen wir das erste Beispiel als Beispiel: Auf i in Funktion a kann nur über Funktion b und nicht auf andere Weise zugegriffen werden, wodurch die Sicherheit von i geschützt wird.

2. Behalten Sie eine Variable im Speicher bei. Wie im vorherigen Beispiel ist i in der Funktion a aufgrund des Abschlusses immer im Speicher vorhanden, sodass i jedes Mal, wenn c() ausgeführt wird, um 1 erhöht wird.


2. Schließung in Java

1. Die Definition von Schließung in Java

Definition: Ein Abschluss kann eine Methode als Variable speichern. Diese Methode hat die Möglichkeit, auf freie Variablen der Klasse zuzugreifen.

Die Java-Sprache selbst unterstützt offiziell keine Abschlüsse, ermöglicht aber die Simulation von Abschlüssen (innere Klassen + Schnittstellen). Abschlüsse können mithilfe anonymer innerer Klassen implementiert werden.

Wie kann man diesem gewöhnlichen Objekt den Zugriff auf die freien Variablen seiner Klasse ermöglichen? Innere Klasse. Die innere Klasse kann auf alle Eigenschaften und Methoden der äußeren Klasse zugreifen.

Das Ausblenden der spezifischen Implementierung ist eine der Funktionen der inneren Klasse. Wie kann sichergestellt werden, dass die spezifische Implementierung ausgeblendet wird und gleichzeitig der Abschluss an die externe Verwendung übergeben wird? Lassen Sie die innere Klasse die gemeinsame Schnittstelle implementieren und wandeln Sie dann das innere Klassenobjekt in den Schnittstellentyp um.

2. Einfache Code-Implementierung:

  	public final static String name = "纯牛奶";// 名称


		private static int num = 16;// 数量


		public Milk() {
			System.out.println(name + ":16/每箱");
		}


		/**
		 * 闭包
		 * 
		 * @return 返回一个喝牛奶的动作
		 */
		public Active HaveMeals() {
			return new Active() {
				public void drink() {
					if (num == 0) {
						System.out.println("木有了,都被你丫喝完了.");
						return;
					}
					num--;
					System.out.println("喝掉一瓶牛奶");
				}
			};
		}


		/**
		 * 获取剩余数量
		 */
		public void currentNum() {
			System.out.println(name + "剩余:" + num);
		}
	}


	/**
	 * 通用接口
	 */
	interface Active {
		void drink();
	}  
	
	//闭包的使用
	public class Person {   
		public static void main(String[] args) {  
			//买一箱牛奶  
			Milk m = new Milk(); 
			Active haveMeals = m.HaveMeals();
			//没事喝一瓶  
			haveMeals.drink();  
			//有事喝一瓶  
			haveMeals.drink(); 
			//看看还剩多少?  
			m.currentNum();  
		}   
	}

Zusammenfassung: 1. Abschlüsse wurden in tatsächlichen Projekten nicht oft verwendet, daher kann ich nichts zu deren Qualität sagen.

2. Es wird empfohlen, Verschlüsse vernünftig zu verwenden, sie nicht vollständig zu verwenden und sie nicht zu missbrauchen.

3. Besondere Aufmerksamkeit: Das Schließen führt dazu, dass Ressourcen nicht recycelt werden. Wenn m in der Hauptmethode wie im obigen Beispiel auf Null gesetzt ist und weiterhin die Trinkmethode mit haveMeals aufgerufen wird, wird weiterhin eine Flasche Milch verwendet verbraucht, was darauf hinweist, dass das Milk-Objekt nicht freigegeben wurde.

【Empfohlenes Lernen: Javascript-Tutorial für Fortgeschrittene

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Java- und JavaScript-Abschlüssen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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