2011-10-27 9 views
6
fuente

El jQuery está envuelto en un cierre, como esto:¿Por qué estos dos parámetros están en la fuente de jQuery?

(function(window, undefined) { 
    //awesome jQuery library code in here 
})(window); 

No entiendo por qué uno de estos parámetros son necesarios.

Dado que window es una variable global, ¿por qué debe pasarse? ¿Cuál es el propósito de pasar un parámetro global y acceder a él dentro del cierre con el mismo nombre?

¿Para qué sirve el parámetro undefined? ¿Por qué no se le pasa ningún valor?

+0

se usará una ventana tan local en este ámbito, por lo que es más rápido de acceder, creo. – Ibu

Respuesta

11

estoy bastante seguro de que esto se ha respondido ya, pero:

  • que pasa en window a) permite la compresión de código para Munge el nombre (es decir, reemplazándolo con un nombre de variable de una sola letra en el anonimato función) yb) asegura que la variable hace referencia al objeto ventana en el momento en que se define la biblioteca, por si alguien redefine window en el ámbito global después de que se cargue jQuery.

  • incluyendo undefined como un argumento (pero no pasa de un valor) hace lo mismo para undefined, permitiendo munging variable y evitar problemas si se redefine la variable undefined (sí, permite Javascript esto).

creo que en ambos casos se supone que esto acelerará las referencias a la variable, ya que hace que ambas variables globales disponibles en el ámbito de la función, que el intérprete buscará antes de mirar en el ámbito global. Pero honestamente no puedo imaginar que la diferencia de rendimiento aquí sea sustancial. Creo que el problema más importante es el munging de nombre variable, que hace que el código sea más compacto cuando se minimiza.

+0

tiene sentido, +1 – Ibu

+0

Si 'window' se redefinió en el ámbito global, ¿no se redirigiría aún cuando lo transfiriera? –

+2

@PeterOlson - no si se redefine más tarde - esto corrige la referencia de 'ventana' en el momento en que se carga la biblioteca de jQuery, por lo que las siguientes chanchullos de' ventana' no tendrán ningún efecto. Supongo que si redefinir la ventana antes de cargar la biblioteca, se romperá, pero entonces te mereces lo que obtienes :). – nrabinowitz

Cuestiones relacionadas