Haben Sie sich jemals den jQuery 1.4- Quellcode unter der Haube angesehen und festgestellt, wie er folgendermaßen gekapselt ist:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Ich habe einen Artikel über JavaScript-Namespacing und einen anderen mit dem Titel " Ein wichtiges Paar von Parens " gelesen , damit ich weiß, was hier vor sich geht.
Aber ich habe diese spezielle Syntax noch nie gesehen. Was undefined
macht das da? Und warum muss window
bestanden werden und dann am Ende wieder erscheinen?
javascript
jquery
syntax
dkinzer
quelle
quelle
Antworten:
Die undefinierte Variable ist eine normale Variable und kann einfach mit geändert werden
undefined = "new value";
. JQuery erstellt also eine lokale "undefinierte" Variable, die WIRKLICH undefiniert ist.Die Fenstervariable wird aus Leistungsgründen lokalisiert. Denn wenn JavaScript eine Variable nachschlägt, durchläuft es zuerst die lokalen Variablen, bis es den Variablennamen findet. Wenn es nicht gefunden wird, durchläuft JavaScript den nächsten Bereich usw., bis es die globalen Variablen filtert. Wenn die Fenstervariable lokalisiert wird, kann JavaScript sie schneller nachschlagen. Weitere Informationen: Beschleunigen Sie Ihr JavaScript - Nicholas C. Zakas
quelle
Nicht definiert
Indem Sie
undefined
als Argument deklarieren, aber niemals einen Wert an ihn übergeben, stellen Sie sicher, dass er immer undefiniert ist, da es sich lediglich um eine Variable im globalen Bereich handelt, die überschrieben werden kann. Dies ista === undefined
eine sichere Alternative zutypeof a == 'undefined'
, die einige Zeichen spart. Dadurch wird der Code auch minifierfreundlicher, da beispielsweise ein paar weitere Zeichen eingespart werdenundefined
könnenu
.Fenster
Beim Übergeben
window
als Argument bleibt eine Kopie im lokalen Bereich, was sich auf die Leistung auswirkt: http://jsperf.com/short-scope . Alle Zugriffe aufwindow
müssen nun eine Ebene weniger in der Bereichskette verlaufen. Wie bei ermöglichtundefined
eine lokale Kopie wiederum eine aggressivere Minimierung.Randnotiz:
Obwohl dies möglicherweise nicht die Absicht der jQuery-Entwickler war,
window
ermöglicht die Übergabe die einfachere Integration der Bibliothek in serverseitige Javascript-Umgebungen, z. B. node.js, in denen kein globaleswindow
Objekt vorhanden ist. In einer solchen Situation muss nur eine Zeile geändert werden, um daswindow
Objekt durch eine andere zu ersetzen . Im Fall von jQuery kann ein Scheinobjektwindow
zum Zwecke des HTML-Scrapings erstellt und übergeben werden (eine Bibliothek wie jsdom kann dies tun).quelle
(function(a,b){})(window);
-a
undb
sind viel kürzer alswindow
undundefined
:)Andere haben erklärt
undefined
.undefined
ist wie eine globale Variable, die auf einen beliebigen Wert neu definiert werden kann. Diese Technik soll verhindern, dass alle undefinierten Prüfungen unterbrochen werden, wenn jemandundefined = 10
irgendwo etwas geschrieben hat. Ein Argument, das niemals übergeben wird, ist garantiert real,undefined
unabhängig vom Wert der Variablenundefined
.Der Grund für das Übergeben des Fensters kann anhand des folgenden Beispiels veranschaulicht werden.
Was protokolliert die Konsole? Der Wert des
window
Objekts richtig? Falsch! 10? Falsch! Es protokolliertundefined
. Der Javascript-Interpreter (oder JIT-Compiler) schreibt es auf diese Weise neu -Wenn Sie jedoch die
window
Variable als Argument erhalten, gibt es keine var und daher keine Überraschungen.Ich weiß nicht, ob jQuery dies tut, aber wenn Sie die
window
lokale Variable irgendwo in Ihrer Funktion aus irgendeinem Grund neu definieren, ist es eine gute Idee, sie aus dem globalen Bereich auszuleihen.quelle
window
wird so übergeben, nur für den Fall, dass sich jemand entscheidet, das Fensterobjekt im IE neu zu definieren, nehme ich dasselbe für denundefined
Fall an, dass es später auf irgendeine Weise neu zugewiesen wird.Oben
window
in diesem Skript wird nur das Argument "Fenster" genannt, ein Argument, das lokaler ist als die globalewindow
Referenz und das, was der Code in diesem Abschluss verwendet. Amwindow
Ende wird tatsächlich angegeben, was für das erste Argument verwendet werden soll, in diesem Fall die aktuelle Bedeutung vonwindow
... die Hoffnung ist, dass Sie es nicht vermasselt haben,window
bevor dies geschieht.Dies ist möglicherweise einfacher zu verstehen, wenn der typischste Fall
.noConflict()
für die Behandlung von jQuery-Plugins angezeigt wird. Für den Großteil des Codes können Sie ihn also weiterhin verwenden$
, auch wenn er etwas anderes alsjQuery
außerhalb dieses Bereichs bedeutet:quelle
Getestet mit 1000000 Iterationen. Diese Art der Lokalisierung hatte keinen Einfluss auf die Leistung. Nicht einmal eine Millisekunde in 1000000 Iterationen. Das ist einfach nutzlos.
quelle
window
könnten Sie einen Gewinn durch eine lokale Kopie sehen.