¿Para qué son estos dos parámetros en la fuente jQuery?

La fuente jQuery está envuelta en un cierre, como este:

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

No entiendo por qué se necesita cualquiera de estos parámetros.

Dado que window es una variable global, ¿por qué se debe pasar? ¿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?

6
La ventana se utilizará como local en este ámbito, por lo que es más rápido de acceder, creo.
agregado el autor Ibu, fuente

1 Respuestas

Estoy bastante seguro de que esto ya ha sido respondido, pero:

  • pasar en la ventana a) permite que la compresión de código munge el nombre (es decir, reemplazarlo con un nombre de variable de una sola letra dentro de la función anónima) yb) asegura que la variable hace referencia al objeto de ventana en el momento en que se define la biblioteca, en caso de que alguien redefine ventana en el ámbito global después de que se haya cargado jQuery.

  • incluyendo undefined como un argumento (pero sin pasar un valor) hace lo mismo para undefined , permitiendo el cambio de variables y evitando problemas si el undefined se redefine (sí, Javascript lo permite).

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

11
agregado
Si window se redefinió en el ámbito global, ¿no sería redifinada cuando la pasas?
agregado el autor Peter Olson, fuente
totalmente tiene sentido, +1
agregado el autor Ibu, fuente
@PeterOlson supongo que entonces "la compresión de código a munge" será la razón
agregado el autor Ibu, fuente
@PeterOlson, no si se redefine más adelante, esto corrige la referencia de window en el momento en que se carga la biblioteca jQuery, por lo que los shenanigans subsiguientes window no tendrán ningún efecto. Supongo que si redefinas la ventana antes de que se cargue la biblioteca, esto se romperá, pero entonces mereces lo que obtienes :).
agregado el autor nrabinowitz, fuente
Ahora que lo pienso, la variable undefined también se puede redefinir, así que esto protege contra eso también. Actualizado la respuesta.
agregado el autor nrabinowitz, fuente
JavaScript - Comunidad española
JavaScript - Comunidad española
4 de los participantes

En este grupo hablamos de JavaScript. Partner: es.switch-case.com