2010-10-02 14 views
7

Recientemente comencé a profundizar en JavaScript y encontré esta construcción de código en JQuery.Comprender el código fuente de jquery

(function(window, undefined) { 
})(window) 

Lectura en desbordamiento de pila (y otras partes) he llegado a la conclusión de que este es el mismo que

function foo(window, undefined) { 
    ... 
} 

foo(window); 

Estoy en lo correcto en mi suposición? Si es así, ¿cuáles son las ventajas de la primera? (aparte de confundir newbs)

+0

http://stackoverflow.com/questions/2716069/how-does-this-javascript-jquery-syntax-work-function-window-undefined – user113716

+1

Para el registro, no hay jQuery en este código, es solo javascript simple –

+1

Estoy tratando de entender jquery; no usarlo, sino la fuente real de jquery, y es ahí donde vi esta construcción por primera vez. – Elija

Respuesta

5

Esta es una función anónima. Se crea y luego sale del alcance, que aquí tiene la ventaja. Se crea e instancia de inmediato. Lo bueno de esto es que no colisionará con ninguna función en el espacio de nombres global, y por lo tanto no eliminará nada de lo que haya incluido en la página.

+0

Eso tiene sentido, especialmente cuando se combina con el enlace en la respuesta a continuación y ver las últimas líneas en jquery en ese contexto. – Elija

16

hay varias cosas que necesita saber para tener sentido de él:

  1. Es una función anónima, lo que simplemente significa que no tiene un nombre.
  2. La función se invoca inmediatamente después de declararse. ¿Ves el paréntesis abierto en la línea 2, inmediatamente después de la definición de la función? Eso significa, "llamar a esta función".
  3. Solo se pasa un parámetro a la función. Ese parámetro es "ventana", que es el nombre del alcance global dentro de un navegador.
  4. La función llamada realmente espera * 2 * parámetros, pero la estamos llamando con uno. Javascript le permite llamar a funciones con más o menos parámetros de los que realmente espera la función. Hay formas de llegar a la lista de parámetros que se aprobó.
  5. Dado que solo estamos pasando un parámetro, el segundo parámetro se establecerá automáticamente en "indefinido". "indefinido" es un valor especial de JavaScript que significa, prepárese, "indefinido".
  6. Ocurre que también tenemos llamado nuestro segundo parámetro con el nombre "indefinido". Entonces, en efecto, hemos creado una variable local (los parámetros son muy parecidos a las variables locales) que es con nombre undefined, y cuyo valor no está definido.
  7. ¿Por qué hicimos eso? Es una forma de garantizar que, dentro de nuestra función anónima, si nos referimos a "indefinido", realmente tendrá el valor de "indefinido". Si no hiciéramos eso, y algún código loco fuera de nuestro alcance redefiniera "indefinido" (diciendo algo como "undefined = 42"), escribiríamos el código pensando que nos referíamos a indefinido, pero en realidad estaríamos refiriéndose a 42. Estos chanchullos con pasar 1 parámetro pero esperando 2, y llamar al segundo uno indefinido, nos protege de tales tonterías.

Espero que esté claro, hágamelo saber si no lo es. Aprendí todo eso del video de Paul Irish mencionado anteriormente.

Cuestiones relacionadas