Nachdem ich diese Antwort gelesen habe, scheint es, dass ich sie nicht ganz verstehe.
Ich lerne Java. Während des heutigen Interviews erwähnte der Interviewer anonyme Klassen. Ich sagte, dass Java 8 den Lamada-Stil bietet und dass es in JS auch das Konzept des Abschlusses gibt. Der Interviewer fragteWas ist ein Abschluss? Warum Verschlüsse verwenden?
Ich sagte: Verwenden Sie es, um den Zugriff zu kontrollieren. Das Innere kann auf das Äußere zugreifen, aber das Äußere kann nicht auf das Innere zugreifen.
Der Interviewer schien mit dieser Antwort nicht sehr zufrieden zu sein. Ich frage mich, was die Experten zu diesem Thema denken?
Nachdem ich diese Antwort gelesen habe, scheint es, dass ich sie nicht ganz verstehe.
Ich lerne Java. Während des heutigen Interviews erwähnte der Interviewer anonyme Klassen. Ich sagte, dass Java 8 den Lamada-Stil bietet und dass es in JS auch das Konzept des Abschlusses gibt. Der Interviewer fragteWas ist ein Abschluss? Warum Verschlüsse verwenden?
Ich sagte: Verwenden Sie es, um den Zugriff zu kontrollieren. Das Innere kann auf das Äußere zugreifen, aber das Äußere kann nicht auf das Innere zugreifen.
Der Interviewer schien mit dieser Antwort nicht sehr zufrieden zu sein. Ich frage mich, was die Experten zu diesem Thema denken?
Durch den Verschluss werden Dampfbrötchen, wie der Name schon sagt, zu Dampfbrötchen~
Dampfbrötchen bestehen vollständig aus Mehl und wenn sie mit Füllung gefüllt sind, werden sie zu Dampfbrötchen
Baozi ist ein gedämpftes Brötchen mit Füllungen
Schließen ist eine Funktion, die über eine eigene Betriebsumgebung verfügt
Fa Ge ist ein Mann mit seiner eigenen Hintergrundmusik~
Einige Kinder verstehen nicht, was es bedeutet, „eine eigene Betriebsumgebung mitzubringen“~
Lassen Sie uns ein weiteres Beispiel geben~
Haben alle Programmierer Instantnudeln gegessen?
Was ist der Unterschied zu gewöhnlichen Nudeln?
Bringen Sie einfach Ihr eigenes Gewürzpaket mit.
Der Gewürzbeutel ist die Kochumgebung für Instantnudeln.
Es vereinfacht das Kochen von Nudeln. Dadurch können Benutzer köstliche Rindfleischnudeln genießen, ohne Kochkenntnisse beherrschen zu müssen.
Der Abschluss der funktionalen Programmierung ist das Würzpaket der Funktion.
Komfort für Benutzer beim Aufrufen von Funktionen. Sie müssen sich keine Sorgen um die Aufrechterhaltung eines komplizierten externen Zustands machen.
Zum Beispiel verwendet Python Abschlüsse auf viele Arten:
statische private Variablen~
Partialfunktionen~
einzelne Parametrisierung~
Dekoratoren~
……
Wenn Sie diese Funktionen nutzen, essen Sie tatsächlich „Instantnudeln“ mit Gewürzpaketen, die von anderen festgelegt wurden.
Eigentlich verstehe ich: Der Zweck des Abschlusses besteht darin, den Umfang der Variablen zu erweitern.
Welche Beziehung besteht zwischen der sofortigen Ausführung von Funktionen und Abschlüssen?
Konzentrieren Sie sich auf das Verständnis von @biancheng. Wenn Sie immer noch interessiert sind, können Sie die Erklärung der Scope-Kette und des Abschlusses von Height Three lesen.
Ein Artikel, den ich gerade gelesen habe: Die am meisten geschmähte Programmiersprache der Geschichte – JavaScript
Die Antwort des Autors ist nicht korrekt und ich wäre nicht zufrieden, wenn ich der Interviewer wäre.
Vereinfacht ausgedrückt bedeutet Abschluss, dass bei der Rückgabe einer Funktion als Objekt ein Abschluss gebildet wird, wenn externe Variablen mitgeführt werden. Ich stimme der Antwort des Klassenkameraden voll und ganz zu, der Dampfbrötchen mit Füllungen verglich, um Dampfbrötchen herzustellen. Obwohl er größtenteils scherzte, war sein Verständnis sehr tiefgreifend.
Wenn eine Funktion externe Variablen verpackt, kann dies dem Programm viel Flexibilität verleihen. Sie können den Abschluss als leichte Schnittstellenkapselung verstehen. Obwohl es sich um dieselbe Funktion nach außen handelt (die aufrufende Methode bleibt dieselbe). weil Wenn die darin enthaltenen Variablen unterschiedlich sind, können viele Funktionen ausgeführt werden. Das ist, was der Klassenkamerad sagte, eine Veranstaltung mit einer eigenen Betriebsumgebung und einem Mann mit seiner eigenen Hintergrundmusik. Es ist beängstigend, darüber nachzudenken.
Wenn Sie mehr darüber erfahren möchten, können Sie einen Artikel lesen, den ich zusammengefasst habe, um Abschlüsse in Python im Detail zu erklären. Obwohl die Programmiersprachen unterschiedlich sind, sind die Prinzipien gleich.
Bei Ihrer Antwort geht es um den Umfang, nicht um den Abschluss. Und diese Antwort ist auch eine ungenaue Antwort. Man kann überhaupt nicht erklären, was intern und was extern ist.
Ich denke, Schließungen sind so. Wenn eine Funktion außerhalb des Bereichs aufgerufen wird, in dem sie definiert ist, greift sie dennoch auf den Bereich zu, in dem sie definiert wurde. Dieses Phänomen wird Schließung genannt.
Es gibt viele spezifische Verwendungszwecke. Zu den häufigsten gehören das Erstellen privater Eigenschaften, das Currying von Funktionen usw.
------------Trennlinie------------
Lassen Sie mich hinzufügen, dass die Essenz des Abschlusses der statische Bereich ist. Da JavaScript keinen dynamischen Bereich hat, greifen Funktionen bei der Definition auf den Bereich zu, sodass Abschlüsse implementiert werden können.
Andere Antworten besagen, dass Abschlüsse Funktionen sind, die mit einer eigenen Betriebsumgebung ausgestattet sind. Aber ist eigentlich keine Funktion in JavaScript eine Funktion, die über eine eigene Ausführungsumgebung verfügt? Manche Leute glauben auch, dass alle Funktionen Abschlüsse sind. Das ist sicherlich nicht falsch, aber für das Verständnis von Abschlüssen macht es eigentlich wenig Sinn. Da Sie Funktionen normalerweise auf diese Weise verwenden, treten auch dann keine Probleme auf, wenn Sie nicht wissen, was ein Abschluss ist. Es ist nur so, dass Sie möglicherweise nicht erkennen, dass der globale Geltungsbereich einen großen Abschluss darstellt.
Unsere übliche Abschlussform ist, dass Funktion a Funktion b abdeckt und Funktion a dann Funktion b zurückgibt, sodass Funktion b, wenn sie an einem anderen Ort als Funktion a ausgeführt wird, immer noch auf den Umfang von Funktion a zugreifen kann. Darunter spiegelt sich die wahre Kraft des Abschlusses wider, „wenn Funktion b an einem anderen Ort als Funktion a ausgeführt wird“.
Kurz gesagt, der Abschluss ist nur eine Programmiertechnik, die auf dem statischen Bereich basiert. Wenn Sie aus Interviewsicht beantworten möchten, was ein Abschluss ist, müssen Sie zunächst die Merkmale des statischen Bereichs erläutern und dann den Punkt hervorheben, dass „Funktion b an einem anderen Ort als Funktion a ausgeführt wird“ als Abschluss betrachtet wird . Baos vollständige Antwort.
Lambda-Kalkül erlaubt nur eine einzelne Eingabe und eine einzelne Ausgabe, daher ist lambda a, b: a + b
gleich lambda a: lambda b: a + b
, was ein Curry ist.
Einfach ausgedrückt lautet die Definition von Abschluss: Eine Funktion kann auf den Bereich zugreifen, wenn er definiert ist.
Die von Ihnen erwähnte Zugangskontrolle ist also nur ein Anwendungsszenario für Schließungen. Die Frage, was Schließungen sind, wurde natürlich nicht beantwortet, sodass der Interviewer natürlich unzufrieden sein wird.
Außerdem unterstützt Java eigentlich keine Abschlüsse. Anonyme innere Klassen sehen ähnlich aus wie Abschlüsse, können jedoch in Bezug auf Funktionalität oder Implementierung nicht als Abschlüsse betrachtet werden. Denn:
Funktionell gesehen müssen Variablen, auf die in anonymen inneren Klassen zugegriffen wird, final sein (Java8 deklariert implizit final)
In Bezug auf die Implementierung wird der endgültige Variablenwert, auf den in der anonymen inneren Klasse zugegriffen wird, tatsächlich von außen kopiert, sodass er nicht wirklich auf den vorherigen Bereich zugreifen kann, weshalb er endgültig sein muss.
Der sogenannte „Abschluss“ bezieht sich auf einen Ausdruck (normalerweise eine Funktion), der viele Variablen und eine an diese Variablen gebundene Umgebung hat, sodass diese Variablen auch Teil des Ausdrucks sind.
Das Erstellen eines Abschlusses in Javascript lässt sich am besten wie folgt erklären:
<code>function a(){ var i=0; function b(){ alert(++i); } return b; } var c=a(); c();</code>
Funktion b ist in Funktion a verschachtelt; Funktion a gibt Funktion b zurück.
Auf diese Weise zeigt die Variable c nach der Ausführung von var c=a() tatsächlich auf die Funktion b. Nach der erneuten Ausführung von c() wird ein Fenster angezeigt, in dem der Wert von i angezeigt wird (das erste Mal ist 1). Dieser Code erstellt tatsächlich einen Abschluss, da die Variable c außerhalb der Funktion a auf die Funktion b innerhalb der Funktion a verweist. Das heißt: Wenn die interne Funktion b der Funktion a von einer Variablen außerhalb der Funktion a referenziert wird, wird ein Abschluss erstellt .
Tatsächlich handelt es sich gemäß der allgemeinen Schreibweise des Abschlusses, einfach ausgedrückt, um eine Funktion, die in einer Funktion verschachtelt ist. Um Namenskonflikte zu vermeiden, verpacken wir in der Teamentwicklung den entsprechenden Code normalerweise in eine Abschlussform, um zu vermeiden, dass er dem globalen Bereich ausgesetzt wird. Ein Nachteil besteht jedoch darin, dass die internen Variablen nicht sofort wiederverwendet werden und die Gefahr eines Speicherüberlaufs besteht.