Schließungen in JavaScript sind wirklich eine Klischeefrage. Vor kurzem habe ich nach meinen eigenen Ausdrucksfähigkeiten gefragt und kann sie nicht vollständig unterstützen. Ich bin verrückt. Auf dem Rückweg dachte ich plötzlich an eine sehr einfache Sache. In der Tat, wenn wir Projekte durchführen, verwenden wir oft Schließungen, aber wenn wir Fragen stellen, sind die Antworten oft die Antworten, die wir oft finden. Leider, ob wir mit Interviews zu tun haben oder wirklich etwas lernen wollen, werde ich Ihnen mein eigenes Verständnis mitnehmen, und das Schreiben ist unvermeidlich.
1.Was ist eine Schließung?
Das Buch Red Bao sagt: "Es bezieht sich auf eine Funktion, die das Recht hat, in einem anderen Funktionsbereich auf Variablen zuzugreifen."
Einfach ausgedrückt, ermöglicht JavaScript die Verwendung interner Funktionen - dh Funktiondefinitionen und Funktionsausdrücke befinden sich im Funktionskörper einer anderen Funktion. Darüber hinaus können diese internen Funktionen auf alle lokalen Variablen, Parameter und anderen internen Funktionen zugreifen, die in der externen Funktion, in der sie sich befinden, deklariert sind. Wenn eine dieser internen Funktionen außerhalb der externen Funktion, die sie enthält, aufgerufen wird, wird ein Verschluss gebildet. In einfachen Worten ist es "Eine Funktion erstellt eine andere Funktion im Inneren, und die letztere Funktion kann die Variablen in der obigen Funktion lesen, und die letztere Funktion kann als" Verschluss "bezeichnet werden".
2. Wie nutzt die Schließungen?
Wenn wir sagen, "durch die Verwendung von Schließungen können wir viele Dinge tun. Zum Beispiel simulieren wir den objektorientierten Codestil, drücken den Code eleganter und präzise aus und verbessern die Ausführungseffizienz des Codes in einigen Aspekten", wird es sich leer fühlen? Werden diese besser sein? Da es in JavaScript keinen wirklichen Umfang auf Blockebene gibt, um jedoch einige lokale Variablen zu deklarieren, die nur die Funktion verwenden kann, werden wir Schließungen verwenden, damit wir die Variablen im globalen Bereich stark reduzieren und den globalen Bereich reinigen können.
Hier sind einige Beispiele:
1. Anonyme Selbstausnahmefunktion
Wir wissen, dass, wenn nicht alle Variablen mit dem Schlüsselwort var hinzugefügt werden, der Standardwert zu den Eigenschaften des globalen Objekts hinzugefügt wird. Das Hinzufügen solcher temporären Variablen zum globalen Objekt gibt es viele Nachteile.
Zum Beispiel: Andere Funktionen können diese Variablen missbrauchen; Das globale Objekt ist zu groß und beeinflusst die Zugangsgeschwindigkeit (da der Wert der Variablen aus der Prototypkette durchquert werden muss).
In jedem Mal, wenn wir die Variable verwenden, verwenden wir das Keyword von VAR. In tatsächlichen Situationen begegnen wir häufig auf eine Situation, in der einige Funktionen nur einmal ausgeführt werden müssen und ihre internen Variablen nicht aufrechterhalten werden müssen.
Zum Beispiel können wir bei der Initialisierung der Benutzeroberfläche Verschlüsse verwenden:
var data = {Tabelle: [], Baum: {}}; (Funktion (dm) {für (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.rows [i]; für (var j = 0; j <row.cells; i ++) {drawcell (i, j);}}}) (Daten);Wir erstellen eine anonyme Funktion und führen sie sofort aus. Da das Externe nicht auf die darin enthaltenen Variablen verweisen kann, wird die Ressource unmittelbar nach der Ausführung der Funktion veröffentlicht. Der Schlüssel ist nicht, das globale Objekt zu verschmutzen.
2. Ergebniscache
Wir werden viele Situationen in der Entwicklung begegnen. Stellen Sie sich vor, wir haben ein sehr zeitaufwändiges Funktionsobjekt, das die Verarbeitung jeder Aufruf lange dauert. Dann müssen wir den berechneten Wert speichern. Beim Aufrufen dieser Funktion suchen wir zuerst im Cache nach. Wenn es nicht gefunden werden kann, werden wir Berechnungen durchführen und dann den Cache aktualisieren und den Wert zurückgeben. Wenn es gefunden wird, können wir den gefundenen Wert direkt zurückgeben. Verschlüsse tun genau dies, da es keine externen Referenzen freigibt, so dass die Werte innerhalb der Funktion erhalten bleiben können.
var cachedSearchbox = (function () {var cache = {}, count = []; return {Attachsearchbox: function (dsid) {if (dsid im cache) {// Wenn das Ergebnis das Ergebnis im cache return cache [dsid]; // return das Objekt im cache direkt} var fsb = new uikit.wEBcl./thsb = new uikit) uikit. cache [dsid] = fsb; // cache if (count.Length> 100) {// Sicherheits -Cache -Größe <= 100 cache [count.shift ()]; CachedSearchbox.attachSearchbox ("input");Auf diese Weise werden wir das Objekt beim zweiten Anruf aus dem Cache lesen.
3. Verpackung
var person = function () {// Der Umfang der Variablen befindet sich innerhalb der Funktion, und auf den VAR -Namen kann nicht außerhalb zugegriffen werden. var name = "Standard"; return {getName: function () {return name; }, setName: function (newname) {name = newName; }}} (); print (person.name); // direkt zugreifen, das Ergebnis ist undefined Print (person.getName ()); Person.SetName ("Abruzzi"); print (person.getName ());4. Implementieren Sie Klassen und Vererbung
Funktion person () {var name = "Standard"; return {getName: function () {return name; }, setName: function (newname) {name = newName; }}}; var p = neue Person (); P.SetName ("Tom"); alert (p.getName ()); var jack = function () {}; // von Person Jack.Prototype = new Person () erbelt; // private Methode hinzufügen Jack.Prototype.say = function () {alert ("Hallo, mein Name ist Jack"); }; var j = neuer Jack (); J.SetName ("Jack"); j.say (); Alert (J.GetName ());Am Ende des Schreibens weiß ich nicht, dass Sie am Ende alle festgestellt haben, dass Sie in den Projekten, die Sie durchgeführt haben, viel davon verwendet haben. Wie auch immer, ich habe es begegnet, und so existieren so Schließungen.
Obwohl es Klischee ist, ist es immer noch sehr wichtig. Sagen Sie einfach, wenn Sie keine Schließungen missbrauchen, führt dies zu einem Speicherleckage, wenn Sie keine Schließungen missbrauchen. Was ist die Speicherleckage auf Baidu?^_^.
Die obige kurze Analyse und Interpretation von Schließungen in JavaScript (Must Read) ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.