2012-10-02 2 views
28

Mögliche Duplizieren:
How do JavaScript closures work?Was ist der Zweck der Übergabe von Argumenten an anonyme Funktionen auf diese Weise?

Ich spiele herum mit den Google Closure Compiler, in Random-Code setzen, um zu sehen, was es tun würde.

Es schrieb einer meiner Funktionen so etwas wie folgt aussehen:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

Wo es scheint, dass "Hello World" das Argument als msg auf die anonyme Funktion übergeben ist es vorangeht. Ich war es für einen Moment suchen, und hatte gedacht, dass ich etwas ähnliches in jQuery Plugins gesehen hatte, das wie etwas aussehen:

(function($) { 
    ... 
})(jQuery); 

die jetzt mehr Sinn für mich, im Rahmen von Konflikten mit $ macht. Aber was ist der Hauptgrund oder der Grund dafür, Argumente in eine anonyme Funktion wie diese zu übertragen? Warum würden Sie die Argumente nicht einfach als Variablen innerhalb der Funktion definieren? Gibt es einen Leistungs - oder Flexibilitätsvorteil beim Schreiben von Funktionen wie diesem?

+0

Für diesen spezifischen Code gibt es keinen wirklichen Grund. Sie könnten einfach 'console.log (" hallo ");'. In der Regel werden jedoch einige lokale Variablen erstellt, auf die nur einige Funktionen zugreifen können, die intern erstellt und exportiert werden. –

+0

Ich wäre gespannt auf Ihren Originalcode, der zu diesem Formular geführt hat. Ich würde wetten, wenn ADVANCED_OPTIMIZATIONS aktiviert wäre, würde es die Funktion ganz loswerden. –

+0

@ user1689607 die Funktion war ein bisschen anders und viel länger.Ich habe es kurz gemacht, um es auf SO sauber zu machen. Mehr Fragen über das Konzept als dieses spezifische Beispiel –

Antwort

10

Es gibt einen signifikanten Unterschied, der auch mit dem Bereich verbunden ist. Der folgende Code:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

ist unter Umständen Reiniger in Bezug auf die Namespace Verschmutzung als dies:

var msg = "Hello World!"; 
console.log(msg); 

weil der zweite Code Größe verläßt, nachdem er nicht mehr benötigt wird, kann aber auch mit anderen Teilen stören des Codes.

Dies ist besonders wichtig, wenn Sie den erwähnten Code außerhalb einer anderen Funktion ausführen: In diesem Fall wäre die Variable msg überall auf der Seite als globale Variable verfügbar.

+0

Aber wie wäre es anders, als nur Ihr zweites Beispiel in eine anonyme Funktion zu verpacken? die Variable würde immer noch am Ende sterben –

+0

Ich hatte unter dem Eindruck, er meinte etwas mehr so: http://jsfiddle.net/cv5Jp/ –

+0

@KevinB Richtig, was ist der Unterschied zwischen deiner Geige und der Funktion, die ich gepostet habe? –

0

Grundsätzlich ist es immer eine gute Idee, halten Sie Ihren Code in diesem verpackt: (function(){/*code*/}()); zu verhindern, dass Ihre Vars kollidieren mit anderen Völkern vars.

Ich denke, die Hauptsache, die Closing-Compiler bekommt, ist das Speichern der 5 Zeichen: var  und =.

0

Es hängt ein bisschen vom Kontext ab. Es gibt einige Bedingungen, unter denen der Compiler nicht versuchen wird, irgendeine Funktion einzubinden (wenn die Bereichsfunktion beispielsweise "eval" enthält). Wenn dies ein globaler Bereich ist und Sie im ADVANCED-Modus ausgeführt werden, wird die Inlining-Opportunity einfach angezeigt, nachdem der Compiler keine Inlinefunktionen mehr versucht (oder ein Fehler im Inlining-Code vorliegt und die Opportunity verpasst wurde). Wenn Sie Ihre Beispielausgabe über den Compiler im erweiterten Modus ausführen, erhalten Sie Folgendes:

Verwandte Themen