eine einfache Frage zum JQuery-Schließen

Lesezeit: 5 Minuten

Was bedeutet das?

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

Um die Frage klarer zu machen, was bedeutet das Umschließen einer Funktion in Klammern in JS (Entschuldigung, ich bin etwas verwirrt über das Konzept der Schließungen). Was ist mit dem $-Parameter? und das “jQuery” in der letzten Klammer?

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

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

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

Ich habe nur mit jquery gearbeitet und plane, mit Mootools zu arbeiten

  • mögliches Duplikat der JavaScript/jQuery-Closure-Funktionssyntax

    – Matt

    24. Juli 13 um 7:41 Uhr

eine einfache Frage zum JQuery Schliesen
Christian C. Salvado

Das Einschließen einer Funktion in Klammern stellt sicher, dass diese Funktion als a ausgewertet wird Funktionsausdruck.

Das passiert, weil die Gruppierungsoperator (die Klammern), kann nur bewerten Ausdrücke.

Wenn keine Klammern verwendet werden, wird dies als a interpretiert Funktionsdeklaration, und es wird einen Syntaxfehler verursachen, da der Funktionsname lautet nicht 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 stark von jQuery-Plug-ins verwendet, da jQuery darin ausgeführt werden kann kein Konflikt Modus, der $ globale Variable wird nicht erstellt, daher wird das globale jQuery-Objekt als Argument davon übergeben Anonyme Funktion und innerhalb dieser Funktion können Sie sich frei darauf beziehen $ (das empfangene Argument).

Denken Sie auch daran, dass der Funktionskontext (die this Schlüsselwort) innerhalb selbstausführender Funktionsausdrücke, die wie im obigen Beispiel aufgerufen werden, beziehen sich immer auf das globale Objekt.

Ausführlichere Informationen zu den Unterschieden zwischen Funktionsausdrücken und Funktionsdeklarationen finden Sie in den folgenden Ressourcen:

  • @CMS Was genau ist der richtige Begriff dafür? Ich habe es eine “selbstausführende anonyme Funktion” genannt. Ist mein Begriff auch korrekt? +1 für eine tolle Antwort!

    – Doug Neiner

    8. Januar 10 um 2:54 Uhr

  • @Doug: Ja, ich denke, Ihr Begriff ist korrekt, aber denken Sie daran, dass Funktionsausdrücke auch einen Namen haben können, er ist nur optional (ist wirklich nützlich zum Debuggen, z. B. zum Untersuchen der Aufrufliste, obwohl JScript sehr schwerwiegende Fehler hat groups.google.com/group/comp.lang.javascript/msg/… und ist auch nützlich für die Rekursion (seit arguments.callee im strikten ES5-Modus ist nicht verfügbar)), also “Selbstausführender Funktionsausdruck” vielleicht etwas genauer…

    – Christian C. Salvado

    8. Januar 10 um 4:20 Uhr


1642555147 637 eine einfache Frage zum JQuery Schliesen
Schlafmann

CMS hat Ihnen die richtige Antwort gegeben, aber ich möchte nur hinzufügen, dass dies keine Schließung ist. 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. Das kombiniert also einfach beides:

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 der $-Parameter ist nur eines der Zeichen, die Javascript für Variablennamen zulässt. Ihre Beispiele sind genau äquivalent zu:

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

Der Hauptgrund dafür ist, dass innerhalb des Ausdrucks der Funktion erstellte Objekte von Eigenschaften und Methoden verwendet werden können, die an übergebene Objekte angehängt sind, ohne diese Objekte öffentlich verfügbar zu machen. Dies kann dabei helfen, Variablenkollisionen zu verhindern. Es ermöglicht auch den Zugriff auf erstellte Variablen als privaten Speicher für alles, was angehängt ist.

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

//Ich kann hier nicht auf myPrivateArray zugreifen… //aber ich kann mit jQuery.addItem etwas hinzufügen.

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

Grundsätzlich ist es, wie CMS gesagt hat, ein Funktionsausdruck. Es gibt ein perfektes Beispiel, um Ihnen zu helfen, ungefähr 2/3 des Weges auf dieser Seite besser zu verstehen.

Der jQuery in der letzten Klammer bedeutet, dass Sie das jQuery-Objekt an die innere Funktion übergeben. Diese innere Funktion übernimmt das Objekt und wird als zugewiesen $. Wenn Sie also auf die zugreifen $ Innerhalb der Funktion wirken Sie tatsächlich auf das jQuery-Objekt ein, das Sie übergeben haben.

Was das Mischen mit jQuery und Mootools angeht, habe ich Mootools noch nie verwendet, daher bin ich mir nicht sicher, wie es sich selbst zuweist. Das einzige, was ich denken würde, ist, dass, wenn es verwendet wird $ wie jQuery können Sie anrufen jQuery.noConflict(); und jQuery vielleicht einer anderen Variablen zuweisen var $j = jQuery; Anschließend können Sie Mootools wie gewohnt verwenden.

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

Das Einschließen in Klammern bewirkt nichts.

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


Dies geschieht, um die Funktion davon unabhängig zu machen $ im globalen Rahmen.
Wenn du schreibst $ In der Funktion beziehst du dich auf die Parameter $, nicht die globale Variable $.

  • Beachten Sie auch, dass das Umschließen einer Funktion in Klammern zwar “nichts tut”, aber erforderlich ist, wenn Sie (jQuery) nach der Funktion hinzufügen möchten.

    – Dan Herbert

    8. Januar 10 um 1:45

das mootools-Äquivalent für den Namensraum $ ist:

(function($) {
    // $ is the mootools one (aliasing document.id)
})(document.id);

Sie können sie in einer Datei kombinieren, aber denken Sie daran, dass mootools ein prototypisches Framework ist und $ nur als Selektor dient, während alle Funktionen in die Prototypen von Element/Array/Klasse usw. gehen. daher funktioniert dies in mootools:

var foo = $("bar");
foo.hide(); // the element inherits .hide()

aber in jquery wird es fehlschlagen und muss als transkribiert werden

var foo = $("#bar");
$(foo).hide();

Der Punkt ist, dass Sie das Zeug, das Mootools in Prototypen exportiert, nicht benennen können.

  • Beachten Sie auch, dass das Umschließen einer Funktion in Klammern zwar “nichts tut”, aber erforderlich ist, wenn Sie (jQuery) nach der Funktion hinzufügen möchten.

    – Dan Herbert

    8. Januar 10 um 1:45

.

541100cookie-checkeine einfache Frage zum JQuery-Schließen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy