JavaScript ist im Vergleich zu anderen Programmiersprachen lockerer, sodass JavaScript -Code voller seltsamer Schreibmethoden ist. Manchmal können Sie Blumen im Nebel sehen. Natürlich ist es auch ein weiteres eingehendes Verständnis der Eigenschaften der JavaScript-Sprache, verschiedene Arten von Schreibmethoden zu verstehen.
(function () {…}) () und (function () {…} ()) sind zwei gängige Möglichkeiten, um Funktionen in JavaScript sofort auszuführen. Zuerst dachte ich, es sei eine anonyme Funktion, die in eine Klammer gewickelt war, und fügte dann eine Klammer hinzu, um die Funktion aufzurufen. Schließlich erreichte ich den Zweck, es unmittelbar nach der Definition der Funktion auszuführen. Später stellte ich fest, dass der Grund für das Hinzufügen von Klammern nicht der Fall war. Um die Ausführung von Funktionen sofort zu verstehen, müssen Sie zunächst einige grundlegende Konzepte von Funktionen verstehen.
Funktionserklärungen, Funktionsausdrücke, anonyme Funktionen
Funktionserklärung: Funktion fnname () {…}; Verwenden Sie das Schlüsselwort der Funktion, um eine Funktion zu deklarieren, und geben Sie dann einen Funktionsnamen an, der als Funktionserklärung bezeichnet wird.
Funktionsausdruck var fnname = function () {…}; deklarieren Sie eine Funktion mit dem Schlüsselwort Funktion, nennt die Funktion jedoch nicht. Schließlich wird der anonymen Funktion eine Variable zugeordnet, die als Funktionxpression bezeichnet wird und die häufigste Form der Funktionxpressionssyntax ist.
Anonyme Funktion: function () {}; Verwenden Sie das Schlüsselwort der Funktion, um eine Funktion zu deklarieren. Die Funktion wird jedoch nicht benannt, so dass sie als anonyme Funktion bezeichnet wird. Anonyme Funktionen gehören zu Funktionsausdrücken. Anonyme Funktionen haben viele Funktionen. Wenn Sie eine Variable zuweisen, erstellen Sie eine Funktion. Wenn Sie ein Ereignis zuweisen, werden Sie Ereignishandler oder einen Verschluss usw.
Die Differenz zwischen Funktionserklärung und Funktionsausdruck besteht darin, dass 1. beim Parsen JavaScript -Code die JavaScript -Engine "Funktionserklärung der Funktionsbeschaffung" (Funktionserklärungserklärung) Funktionserklärung in der aktuellen Ausführungsumgebung (Umfang). Der Funktionsausdruck muss warten, bis die Javascirtp -Engine an seine Linie ausgeführt wird, bevor der Funktionsausdruck von oben nach unten analysiert wird. 2. Der Funktionsausdruck kann sofort mit Klammern nach dem Funktionsausdruck aufgerufen werden. Die Funktionserklärung kann nicht durchgeführt werden und kann nur in Form von fnnname () aufgerufen werden. Hier sind zwei Beispiele für die Unterschiede zwischen den beiden.
fnnname (); function fnname () {...} // normal, da die Funktionserklärung "Förderung" der Funktionserklärung werden kann fnname (); var fnname = function () {...} // Ein Fehler wird gemeldet, der Variable fnname hat keinen Verweis auf die Funktion, und der Funktionsaufruf muss nach dem Funktionsausdruck sein, nach dem Funktionsausdruck nach dem Funktionsausdruck müssen. var fnnname = function () {alert ('Hallo Welt');} (); // Pakete werden nach dem Funktionsausdruck hinzugefügt. Wenn die JavaScript -Engine hier analysiert, kann die Funktion sofort als Funktion fnnname () {alert ('Hello World') bezeichnet werden;} (); // Es wird keinen Fehler geben, aber die JavaScript -Engine analysiert nur die Funktionserklärung, ignoriert die nachfolgenden Klammern und die Funktionserklärung wird nicht als Funktion bezeichnet () {Konsole. } (); // Der Syntaxfehler, obwohl anonyme Funktionen zu Funktionsausdrücken gehören, wird kein Zuordnungsvorgang durchgeführt, // so behandelt die JavaScript -Engine das Schlüsselwort der Funktion am Anfang als Funktionserklärung und meldet einen Fehler: Ein Funktionsname ist erforderlichNachdem ich einige grundlegende Funktionskonzepte verstanden hatte, schaute ich auf die beiden Möglichkeiten zum Schreiben zurück (function () {…}) () und (function () {…} ()) sofort. Zuerst dachte ich, es sei eine anonyme Funktion, die in eine Klammer gewickelt war, und fügte eine Klammer hinzu, um die Funktion sofort aufzurufen. Zu dieser Zeit wusste ich nicht, warum ich Klammern hinzufügen musste. Später wurde mir klar, dass ich es sofort nennen konnte, wenn ich nach der Funktionskörper Klammern hinzufügen musste. Dann muss diese Funktion ein Funktionsausdruck sein, keine Funktionserklärung.
(Funktion (a) {console.log (a); // Firebug -Ausgabe 123, Verwenden Sie den () Operator}) (123); (Funktion (a) {console.log (a); // Firebug Output 1234, Verwenden Sie den () Operator} (1234)); ! Funktion (a) {console.log (a); // Firebug Output 12345, Verwendung! Operator} (12345); +Funktion (a) {console.log (a); // Firebug Output 123456, verwenden Sie den + Operator} (123456); -Funktion (a) {console.log (a); // Firebug Output 1234567, verwenden Sie den Operator} (1234567); var fn = function (a) {console.log (a); // Firebug -Ausgabe 12345678, verwenden Sie den = Operator} (12345678)Sie können das Ausgabeergebnis sehen und vor der Funktion hinzufügen! , +, - und sogar Kommas können verwendet werden, um unmittelbar nach der Definition der Funktion auszuführen, und ()! Operatoren wie +, -, = Funktionserklärungen in Funktionsausdrücke umwandeln und die Mehrdeutigkeit zwischen der Identifizierung von Funktionsausdrücken und Funktionen der JavaScript -Engine beseitigen. Damit wird die JavaScript -Engine mitgeteilt, dass dies ein Funktionsausdruck ist, keine Funktionserklärung. Sie können Klammern nach dem IT hinzufügen und den Funktionscode sofort ausführen.
Das Hinzufügen von Klammern ist der sicherste Weg, es zu tun, denn! Bediener wie, +und - führen auch Operationen mit dem Rückgabewert der Funktion durch, was manchmal unnötige Probleme verursacht.
Aber was nützt das Schreiben auf diese Weise?
In JavaScript gibt es kein Konzept des privaten Umfangs. Wenn Sie einige Variablen im globalen oder lokalen Bereich für ein von mehreren Personen entwickeltes Projekt deklarieren, kann dies von anderen mit demselben Namen überschrieben werden. Gemäß den Eigenschaften der Bereichskette von JavaScript -Funktionen kann diese Technik verwendet werden, um einen privaten Bereich zu imitieren und eine anonyme Funktion als "Container" zu verwenden. Der "Container" kann auf externe Variablen zugreifen, während die externe Umgebung im "Container" nicht auf Variablen zugreifen kann, sodass die in (function () {…}) () definierten Variablen nicht mit externen Variablen in Konflikt stehen, die häufig als "anonymer Wrapper" oder "Namespace" bekannt sind.
JQuery verwendet diese Methode. Wenn JQuery -Code in (Funktion (Fenster, undefiniert) {… JQuery Code…} (Fenster) ist, kann er die internen Variablen von JQuery beim Aufrufen von JQuery -Code im globalen Bereich schützen.
Dieser Artikel ist ein persönliches Verständnis und eine persönliche Zusammenstellung. Wenn es Fehler gibt, weisen Sie diese bitte darauf hin. Auf die Ansichten im Artikel beziehen sich auf:
"Autoritative Leitfaden zu JavaScript" und "Advanced Programming"