18 Stimmen

eine einfache Frage zu jquery closure

Was bedeutet das?

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

um die Frage klarer zu machen, was bedeutet das Einschließen einer Funktion in Klammern in JS (sorry, ich bin ein wenig verwirrt über das Konzept der Schließungen). Was ist mit dem $-Parameter? und die "jQuery" in der Endklammer?

Kann ich dasselbe mit mootools tun und sie in einer JS-Datei kombinieren?

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

(function($){})(mooTools);

Ich habe bisher nur mit Jquery gearbeitet und plane, mit Mootools zu arbeiten.

25voto

Christian C. Salvadó Punkte 763569

Wenn Sie eine Funktion zwischen Klammern einschließen, wird diese Funktion als Funktionsausdruck .

Dies geschieht, weil die Gruppierungsoperator (die Klammern), kann nur auswerten Ausdrücke .

Wenn keine Klammern verwendet werden, wird dies als Funktionsdeklaration und verursacht einen Syntaxfehler, da der Funktionsname no optional für Funktionsdeklarationen.

(function(arg){
  alert(arg); // alerts test
})("test");

Im obigen Beispiel wird der Funktionsausdruck automatisch ausgeführt, wobei ein Argument übergeben wird.

Dieses Muster wird häufig von jQuery-Plugins verwendet, da jQuery in noConflict Modus, die $ globale Variable wird nicht erstellt, daher wird das globale jQuery-Objekt als Argument dieser anonyme Funktion und innerhalb dieser Funktion können Sie frei auf sie verweisen als $ (das empfangene Argument).

Denken Sie daran, dass auch der Funktionskontext (die this Schlüsselwort) in selbstausführenden Funktionsausdrücken, die wie im obigen Beispiel aufgerufen werden, beziehen sich immer auf das Objekt Global.

Ausführlichere Informationen über die Unterschiede zwischen Funktionsausdrücken und Funktionsdeklarationen finden Sie in den folgenden Ressourcen:

6voto

slebetman Punkte 100693

CMS hat Ihnen die richtige Antwort gegeben, aber ich möchte noch hinzufügen, dass es sich nicht um einen Abschluss handelt. Dies ist nur der Operator (), der verwendet wird, um das Ergebnis eines Ausdrucks zurückzugeben, der in diesem Fall ein Funktionsausdruck ist, und die Tatsache, dass in Javascript eine zurückgegebene anonyme Funktion direkt aufgerufen werden kann. Dies ist also einfach eine Kombination aus beidem:

var x = (1+1); // <-- () evaluates an expression

und:

var arr = [0,1,2];
arr.push(function(text){alert(text)});
arr[3]('hello'); // <-- function returned by array called directly

Und was den $-Parameter angeht, so ist das nur eines der Zeichen, die Javascript für Variablennamen erlaubt. Ihre Beispiele ist genau gleich zu:

(function(jQ){})(jQuery);
(function(moo){})(mooTools);

5voto

Tracker1 Punkte 18421

Der Hauptgrund dafür ist, dass Objekte, die innerhalb des Funktionsausdrucks erstellt werden, von Eigenschaften und Methoden, die an übergebene Objekte angehängt sind, genutzt werden können, ohne dass diese Objekte öffentlich zugänglich sind. Dies kann dabei helfen, Variablenkollisionen zu vermeiden. Es ermöglicht auch, dass auf die erstellten Variablen als privater Speicher für alles, was angehängt ist, zugegriffen werden kann.

(function($){
//jQuery is available here as $
var myPrivateArray = []; //this is private
$.addItem = function(item) {
  myPrivateArray.push(item);
}
})(jQuery);

//I can't access myPrivateArray here...
//but I can use jQuery.addItem to add something.

1voto

Jim Schubert Punkte 19957

Hier ist ein Artikel über Schließungen: http://www.jibbering.com/faq/faq_notes/closures.html

Im Grunde handelt es sich, wie CMS bereits sagte, um einen Funktionsausdruck. Ein perfektes Beispiel zum besseren Verständnis finden Sie etwa 2/3 des Weges auf dieser Seite.

En jQuery in der letzten Klammer bedeutet, dass Sie das jQuery-Objekt an die innere Funktion übergeben. Diese innere Funktion nimmt das Objekt und es wird zugewiesen als $ . Wenn Sie also auf die $ innerhalb der Funktion, Sie sind tatsächlich auf die jQuery-Objekt, das Sie übergeben haben handeln.

Wie für das Mischen diese mit jQuery und Mootools, ich habe nie Mootools verwendet, so dass ich nicht sicher bin, wie es selbst zuweist. Das einzige, was ich denken würde, ist, dass, wenn es verwendet $ wie jQuery, können Sie die jQuery.noConflict(); und weisen Sie jQuery einer anderen Variablen zu, vielleicht var $j = jQuery; Dann können Sie Mootools wie gewohnt verwenden.

0voto

SLaks Punkte 832502

function($) { ... } erstellt eine Funktion, die einen Parameter namens $ .

Ein Einschluss in Klammern bringt nichts.

Hinzufügen von (jQuery) ruft die Funktion mit jQuery als Parameter.


Dies geschieht, um die Funktion unabhängig zu machen von $ im globalen Bereich.
Wenn Sie schreiben $ in der Funktion, beziehen Sie sich auf die Parameter $ und nicht die globale Variable $ .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X