¿Alguna vez has echado un vistazo al código fuente de jQuery 1.4 y has notado cómo está encapsulado de la siguiente manera:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
He leído un artículo sobre el espacio de nombres de JavaScript y otro llamado " Un par importante de parejas ", así que sé algo sobre lo que está sucediendo aquí.
Pero nunca antes había visto esta sintaxis en particular. ¿Qué está undefined
haciendo eso allí? ¿Y por qué es window
necesario aprobarlo y luego volver a aparecer al final?
javascript
jquery
syntax
dkinzer
fuente
fuente
Respuestas:
Lo indefinido es una variable normal y se puede cambiar simplemente con
undefined = "new value";
. Entonces jQuery crea una variable local "indefinida" que REALMENTE no está definida.La variable de ventana se convierte en local por razones de rendimiento. Porque cuando JavaScript busca una variable, primero revisa las variables locales hasta que encuentra el nombre de la variable. Cuando no se encuentra, JavaScript pasa por el siguiente alcance, etc. hasta que se filtra a través de las variables globales. Entonces, si la variable de ventana se convierte en local, JavaScript puede buscarla más rápido. Más información: Acelere su JavaScript - Nicholas C. Zakas
fuente
Indefinido
Al declararlo
undefined
como argumento pero nunca pasarle un valor, se garantiza que siempre esté indefinido, ya que es simplemente una variable en el ámbito global que se puede sobrescribir. Esto hacea === undefined
una alternativa segura atypeof a == 'undefined'
, que ahorra algunos caracteres. También hace que el código sea más amigable con los minificadores, ya queundefined
se puede acortar,u
por ejemplo, para guardar algunos caracteres más.Ventana
Pasar
window
como argumento mantiene una copia en el ámbito local, lo que afecta el rendimiento: http://jsperf.com/short-scope . Todos los accesoswindow
ahora tendrán que viajar un nivel menos en la cadena de alcance. Al igual que conundefined
, una copia local nuevamente permite una minificación más agresiva.Nota al margen:
Aunque esta puede no haber sido la intención de los desarrolladores de jQuery, la transferencia
window
permite que la biblioteca se integre más fácilmente en entornos Javascript del lado del servidor, por ejemplo node.js , donde no hay unwindow
objeto global . En tal situación, solo se necesita cambiar una línea para reemplazar elwindow
objeto con otra. En el caso de jQuery,window
se puede crear y pasar un objeto simulado con el fin de raspar HTML (una biblioteca como jsdom puede hacer esto).fuente
(function(a,b){})(window);
-a
yb
son mucho más cortas quewindow
yundefined
:)Otros lo han explicado
undefined
.undefined
es como una variable global que se puede redefinir a cualquier valor. Esta técnica es para evitar que se rompan todas las comprobaciones indefinidas si alguien escribió decir, enundefined = 10
algún lugar. Se garantiza que un argumento que nunca se pasa será real,undefined
independientemente del valor de la variableundefined
.La razón para pasar la ventana se puede ilustrar con el siguiente ejemplo.
¿Qué registra la consola? El valor del
window
objeto ¿verdad? ¡Incorrecto! 10? ¡Incorrecto! Se registraundefined
. El intérprete de Javascript (o el compilador JIT) lo reescribe de esta manera:Sin embargo, si obtiene la
window
variable como argumento, no hay var y, por lo tanto, no hay sorpresas.No sé si jQuery lo está haciendo, pero si está redefiniendo
window
la variable local en cualquier lugar de su función por cualquier razón, es una buena idea tomarla prestada del alcance global.fuente
window
se pasa así en caso de que alguien decida redefinir el objeto de ventana en IE, supongo lo mismoundefined
, en caso de que se reasigne de alguna manera más tarde.La parte superior
window
de ese script es simplemente nombrar el argumento "ventana", un argumento que es más local que lawindow
referencia global y que es lo que usará el código dentro de este cierre. Alwindow
final, en realidad se especifica qué pasar para el primer argumento, en este caso, el significado actual dewindow
... la esperanza es que no se haya equivocadowindow
antes de que eso suceda.Puede ser más fácil pensar en esto mostrando el caso más típico utilizado en jQuery,
.noConflict()
manejo de complementos , por lo que para la mayoría del código aún puede usar$
, incluso si significa algo más quejQuery
fuera de este alcance:fuente
Probado con 1000000 iteraciones. Este tipo de localización no tuvo efecto en el rendimiento. Ni siquiera un milisegundo en 1000000 iteraciones. Esto es simplemente inútil.
fuente
window
, podría ver algo de ganancia por una copia local.