1. Funktionsumfang
1. Funktionsumfang
Dies bedeutet, dass sich der Bereich in einer "Funktion" befindet und alle zu dieser Funktion gehörenden Variablen im gesamten Funktionsbereich verwendet und multiplexiert werden können.
Funktion foo (a) {var b = 2; Funktion bar () {// ...} var c = 3;} bar (); // fehlgeschlagene Konsole.log (a, b, c); // alle drei scheitertenWenn mehrere Kennungen in der obigen "Foo" -Funktion gemeldet werden, wenn sie außerhalb der Funktion platziert und zugegriffen werden.
2. Führen Sie den Funktionsausdruck sofort aus
Hinzufügen von Wrapper -Funktionen außerhalb eines Codes -Snippets kann die internen Variablen und Funktionsdefinitionen "ausblenden", und der externe Bereich kann in der Wrapper -Funktion auf nichts zugreifen.
Zum Beispiel die obige Balken, A und andere Kennungen. Dies schützt die Variable vor Kontamination.
Beim Schreiben von Plug-Ins verwenden Sie häufig sofort Funktionsausdrücke, um die Variablen im Inneren zu schützen.
var a = 2; (Funktion foo () {var a = 3; console.log (a); // 3}) (); console.log (a); // 2Der erste () in "foo" verwandelt die Funktion in einen Ausdruck, und das zweite () führt diese Funktion aus.
Es gibt einen besonderen Begriff: iife, der den unmittelbar aufgerufenen Funktionsausdruck darstellt;
1. Erweiterte Verwendung besteht darin, sie als Funktions- und Übergabeparameter in aufzurufen
(Funktion iife (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2}) (Fenster);2. Ein wechselnder Zweck besteht darin, die laufende Reihenfolge des Codes umzukehren, der in CMD- oder AMD -Projekten häufig verwendet wird.
(Funktion iife (factory) {factory (Fenster);}) (Funktion def (global) {var a = 3; console.log (a); // 3console.log (global.a); // 2});2. Blockbereich
JavaScript unterstützt keinen Blockbereich.
für (var i = 0; i <10; i ++) {console.log (i);}Das "I" im obigen Code entspricht den folgenden
var i; für (i = 0; i <10; i ++) {console.log (i);}Aber es gibt Ausnahmen, "Try/Catch", Catch ist ein Blockbereich.
try {undefined (); // eine illegale Operation ausführen, um eine Ausnahme zu erzwingen} catch (err) {console.log (err); // kann normal ausführen! } console.log (err); // ReferenzError: Irgendw. NICHT gefundenES6 hat den Status quo geändert und ein neues LET -Schlüsselwort eingeführt, das Variablen an jeden Bereich binden kann (normalerweise in {..}). Mit anderen Worten, die Variablen, die für die Let implizit im Blockbereich deklariert sind.
3.. Verbesserung
Das Verhalten des Funktionsbereichs und des Blockbereichs ist gleich und kann zusammengefasst werden wie: Jede in einem Umfang deklarierte Variable wird an diesen Bereich beigefügt.
1) Zusammenstellung und Ausführung
Alle Variablen- und Funktionserklärungen werden zuerst verarbeitet, bevor ein Code ausgeführt wird. Sie können das folgende Code -Beispiel sehen.
a = 2; var a; Konsole.log (a); // 2
Dieser Code entspricht:
Die Definitionserklärung var a; // Die Definitionserklärung wird in der Kompilierungsstufe A = 2; // Zuordnungsdeklaration durchgeführt, um auf die Ausführungsstufekonsole zu warten.log (a);
2) Funktionspriorität
Die Funktion wird zuerst gefördert, und dann wird die Variable sein.
foo (); // 1var foo; Funktion foo () {console.log (1);} foo = function () {console.log (2);};Der Ausdruck von Var Foo -Funktion, obwohl vor der Funktionserklärung foo () eine doppelte Deklaration ist (und daher ignoriert), da die Funktionserklärung vor der normalen Variablen gefördert wird.
Und der obige Code entspricht:
Funktion foo () {console.log (1);} foo (); // 1foo = function () {console.log (2);};4. Schließung
Verschlüsse beziehen sich auf Funktionen, die Zugriff auf Variablen in einem anderen Funktionsbereich haben. Der häufigste Weg, um Schließungen zu erstellen, besteht darin, eine andere Funktion innerhalb einer Funktion zu erstellen.
Zugriff auf lokale Variablen dieser Funktion über eine andere Funktion kann die Verwendung von Verschlusssäuren die Domäne der Aktionskette durchbrechen und Variablen und Methoden innerhalb der Funktion nach außen übergeben
Verschlussfunktionen:
1. Funktionen sind von Natur aus verschachtelt
2. Interne Funktionen können sich auf äußere Parameter und Variablen beziehen
3.. Parameter und Variablen werden nicht vom Müllsammlermechanismus erfasst
1) Definition
Wenn sich eine Funktion erinnern kann und auf den von sich befindlichen Bereich zugreifen kann, wird ein Verschluss erzeugt, selbst wenn die Funktion außerhalb des aktuellen Bereichs ausgeführt wird.
Funktion foo () {var a = 2; Funktion bar () {console.log (a);} return bar;} var baz = foo (); baz (); // 2 - Dies ist die Wirkung des Verschlusses.1. Weisen Sie "Baz" die Funktion "Balken" zu und führen Sie "Baz" aus. Der aktuelle Umfang befindet sich nicht im Rahmen von "Bar", kann aber ausgeführt werden.
2. Die Schließung verhindert auch die Müllsammlung. Wenn das "Foo" ausgeführt wird, existiert der interne Umfang noch. Auf diese Weise kann der "Baz" ausgeführt werden.
2) Übergeben Sie die Funktion als Parameter
Funktion foo () {var a = 2; function baz () {console.log (a); // 2} bar (baz);} Funktionsleiste (fn) {fn (); // Das ist der Verschluss! }Übergeben Sie den internen Funktionsbaz an die Balken, und wenn diese interne Funktion (FN) aufgerufen wird, kann der Abschluss des internen Bereichs von Foo () beobachtet werden, da er zu einem Zugriff auf a zugreifen kann.
Wenn Sie eine Funktion als Werttyp auf der ersten Ebene behandeln und überall übergeben, werden Sie die Anwendung von Schließungen in diesen Funktionen sehen.
In Timern, Ereignishörern, AJAX-Anfragen, Cross-Window-Kommunikation, Webarbeitern oder anderen asynchronen (oder synchronen) Aufgaben, solange die Rückruffunktion verwendet wird, verwendet sie tatsächlich Verschluss!
3) Schleifen und Schließungen
für (var i = 1; i <= 5; i ++) {setTimeout (Funktion Timer () {console.log (i);}, i * 1000);}Jedes Mal, wenn es gedruckt wird, wird es 6 sein und der Rückruf der Verzögerungsfunktion wird nur am Ende der Schleife ausgeführt.
Nach der Funktionsweise des Umfangs ist die Realität, dass die fünf Funktionen in der Schleife in jeder Iteration getrennt definiert werden, sie jedoch alle in einem gemeinsamen globalen Bereich eingeschlossen sind, so dass es tatsächlich nur eine I gibt.
Verwenden Sie nun Schließungen, um das unterschiedliche I -Druck jedes Mal zu implementieren.
für (var i = 1; i <= 5; i ++) {(Funktion (j) {setTimeout (Funktion Timer () {console.log (j);}, j * 1000);}) (i);}IIFE erstellt Scopes, indem er sofort eine Funktion erklärt und ausführt. Der Rückruf in SetTimeout kann sich an den aktuellen Bereich erinnern, und der Parameter "J" in jedem Bereich ist unterschiedlich.
Das obige ist eine detaillierte Erklärung des verwirrendsten Umfangs, der Verbesserung und des Kenntnisses in JavaScript, das der Editor Ihnen vorstellt. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!