Frage

Ich versuche, meinen Kopf um Schließungen zu wickeln (es ist ein Witz es irgendwo in) und ich lief über diese:

(function () { /* do cool stuff */ })();

Wie funktionierts? Was ist der Zweck die Funktion in Pars der Umsetzung? Warum die leeren Pars danach?

War es hilfreich?

Lösung

Der Punkt dabei ist, dass alle Variablen in den kühlen Sachen erklärt werden nicht in globalem Namensraum erstellt werden. Jede Funktion in Javascript wird Erstellen einer solchen Umfang. Angenommen, Sie einige haben Javascript Sie ausführen möchten. Wenn Sie dies tun:

var b = 1; 
// stuff using b

Und ein anderer Code verwendet b, wird es links über Wert. (Oder, noch schlimmer, wenn ein anderer Code legt b, bevor der Code ausgeführt wird, versucht dann später seinen alten Wert zu erhalten, können Sie es in der Zwischenzeit geändert haben würden.)

Auf der anderen Seite, wenn Sie diesen Code haben, die erklärt und ruft dann die Funktion:

function a() { 
     var b = 1;
}

a();

Und ein anderer Code später verwendet b, wird es nicht Ihre Werte sehen, da b auf die Funktion lokal ist. Das Problem dabei ist natürlich, ist, dass Sie nach wie vor weltweit einen Namen machen - „a“, in diesem Fall. So wollen wir eine Funktion ohne Namen - das ist, warum Sie den Code erhalten Sie beschrieben. Es deklariert eine Funktion ohne Namen, und dann nennt es.

Leider kann man nicht einfach sagen:

function() { ... }()

da dies als eine Funktion Deklaration analysiert werden Anweisung , und dann wird ein Syntaxfehler. Durch das Einwickeln in Klammern die Funktionsdeklaration, erhalten Sie eine Funktion Ausdruck , die dann aufgerufen werden kann. Sie nennen es wie jeder andere Funktion Ausdruck (wie a, oben), den zweiten Satz von Pars verwenden. wenn die Funktionsargumente Zum Beispiel nehmen, würden Sie sie dort übergeben:

(function(a) { ... })(1)

Andere Tipps

Das erzeugt eine Funktion, ruft er, und verwirft es.

Es könnte klarer, wenn man es wie folgt aussehen:

var throwaway = function(){
    // do cool stuff
};
throwaway();

Dies geschieht über einen privaten Namensraum zu schaffen. Code in der Funktion kann in der Seite geladen mit anderen Code, ohne sich Gedanken Funktionen und Variablen über Konflikt zu geraten.

Ich kam erst vor kurzem in diesem Beitrag. Diese Art der Funktionsdefinition & Aufruf heißt Selbst Aufruf Funktionen .

(function(){  //code })();

Der Code innerhalb der Funktion wird unmittelbar nach seiner Definition ausgeführt werden.

Dass konstruieren Mittel eine anonyme Funktion deklarieren und sofort ausgeführt. Der Grund, warum Sie Ihren Code in einer Funktion Körper gelegt ist, weil die Variablen, die Sie darin definieren, um die Funktion und nicht als globale Variablen lokal bleiben. Allerdings werden sie noch in dieser Funktion definiert die Verschlüsse sichtbar sein.

Die Pars um die Funktion deutlich machen, dass die Funktion ein Ausdruck ist. Die Pars sind nach dem Aufruf der Funktion.

Beachten Sie, dass die Funktion keinen Namen hat.

Ein Schließung Ansatz ist Variablen an die Funktion zu übergeben:

(function($, var_1, var_2) {
    // use JQuery, var_1 and var_2 as local variables
})($, var_1, var_2);

Setzen Sie die Funktionsdeklaration innerhalb Pars schafft einen Ausdruck, der in dem anonymen Funktion auswertet. Daher wertet die erste klammert auf eine Funktion.

Die „leeren Pars“ am Ende aufrufen, um die definierte Funktion, so „// cool stuff tun“ sofort ausgeführt wird.

Dies ist ein Weg, um Code on-the-fly auszuführen, während auch Variablen aus dem globalen Bereich zu halten.

Was hier dargestellt ist, hat jedoch nichts mit Verschlüssen zu tun - zumindest nicht direkt. Verschlüsse sind über einen lexikalischen Umfang beibehalten wird, nachdem ein Elternteil Funktion bereits verlassen hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top