Avez-vous déjà jeté un œil sous le capot sur le code source de jQuery 1.4 et remarqué comment il est encapsulé de la manière suivante:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
J'ai lu un article sur l' espacement de noms JavaScript et un autre intitulé " Une paire importante de parenthèses ", donc j'en sais un peu sur ce qui se passe ici.
Mais je n'ai jamais vu cette syntaxe particulière auparavant. Qu'est-ce que ça undefined
fait là-bas? Et pourquoi window
faut-il passer et ensuite réapparaître à la fin?
javascript
jquery
syntax
Dkinzer
la source
la source
Réponses:
L'indéfini est une variable normale et peut être modifié simplement avec
undefined = "new value";
. Ainsi, jQuery crée une variable locale "non définie" qui est VRAIMENT indéfinie.La variable window est rendue locale pour des raisons de performances. Parce que lorsque JavaScript recherche une variable, il passe d'abord par les variables locales jusqu'à ce qu'il trouve le nom de la variable. Lorsqu'il n'est pas trouvé, JavaScript passe par la portée suivante, etc. jusqu'à ce qu'il filtre les variables globales. Donc, si la variable window est rendue locale, JavaScript peut la rechercher plus rapidement. Plus d'informations: Accélérez votre JavaScript - Nicholas C. Zakas
la source
Indéfini
En déclarant
undefined
en tant qu'argument mais en ne lui passant jamais de valeur, il est toujours indéfini, car il s'agit simplement d'une variable dans la portée globale qui peut être écrasée. Cela constituea === undefined
une alternative sûre àtypeof a == 'undefined'
, qui enregistre quelques caractères. Cela rend également le code plus convivial pour les minificateurs, car ilundefined
peut être raccourci,u
par exemple, en enregistrant quelques caractères supplémentaires.La fenêtre
Passer
window
en argument garde une copie dans la portée locale, ce qui affecte les performances: http://jsperf.com/short-scope . Tous les accès àwindow
devront désormais parcourir un niveau de moins dans la chaîne de portée. Comme avecundefined
, une copie locale permet à nouveau une minification plus agressive.Sidenote:
Bien que cela n'ait peut-être pas été l'intention des développeurs jQuery, le passage
window
permet à la bibliothèque d'être plus facilement intégrée dans les environnements Javascript côté serveur, par exemple node.js - où il n'y a pas d'window
objet global . Dans une telle situation, une seule ligne doit être modifiée pour remplacer l'window
objet par une autre. Dans le cas de jQuery, unwindow
objet fictif peut être créé et transmis à des fins de scraping HTML (une bibliothèque telle que jsdom peut le faire).la source
(function(a,b){})(window);
-a
etb
est beaucoup plus courte quewindow
etundefined
:)D'autres ont expliqué
undefined
.undefined
est comme une variable globale qui peut être redéfinie à n'importe quelle valeur. Cette technique permet d'éviter que tous les contrôles non définis ne se rompent si quelqu'un écrit par exemple,undefined = 10
quelque part. Un argument qui n'est jamais passé est garanti réelundefined
quelle que soit la valeur de la variableundefined
.La raison de passer la fenêtre peut être illustrée par l'exemple suivant.
Que consigne la console? La valeur de l'
window
objet, non? Faux! dix? Faux! Il enregistreundefined
. L'interpréteur Javascript (ou compilateur JIT) le réécrit de cette façon -Cependant, si vous obtenez la
window
variable comme argument, il n'y a pas de var et donc pas de surprises.Je ne sais pas si jQuery le fait, mais si vous redéfinissez
window
une variable locale n'importe où dans votre fonction pour une raison quelconque, c'est une bonne idée de l'emprunter à une portée globale.la source
window
est passé comme ça juste au cas où quelqu'un déciderait de redéfinir l'objet window dans IE, je suppose la même chose pourundefined
, au cas où il serait réaffecté d'une manière ou d'une autre plus tard.Le début
window
de ce script est juste le nom de l'argument "window", un argument qui est plus local que lawindow
référence globale et ce que le code à l'intérieur de cette fermeture utilisera. Lewindow
à la fin spécifie en fait ce qu'il faut passer pour le premier argument, dans ce cas, le sens actuel dewindow
... l'espoir est que vous n'avez pas foiréwindow
avant que cela n'arrive.Cela peut être plus facile à penser en montrant le cas le plus typique utilisé dans jQuery, la
.noConflict()
gestion des plugins , donc pour la majorité du code, vous pouvez toujours utiliser$
, même si cela signifie autre chose qu'enjQuery
dehors de cette portée:la source
Testé avec 1000000 itérations. Ce type de localisation n'a eu aucun effet sur les performances. Pas même une seule milliseconde en 1000000 itérations. C'est tout simplement inutile.
la source
window
vous pourriez voir un gain avec une copie locale.