2011-01-04 4 views
8

jQuery comienza envolviendo todo ello es el código en una función anónima:¿Cuál es el propósito del contenedor de función anónima en jQuery?

(function (window, undefined) { 
    /* 
    ...jquery code... 
    */ 
}) (window); 

me sale que la función se ejecuta inmediatamente después de todo el guión se está leyendo, pero ¿cuál es el propósito de los argumentos? Uno es una referencia de objeto global, el otro es una referencia de propiedad.

Ahora, recuerdo que antes en el desarrollo del guión, indefinido realmente se definió como algo más (¿me acordaré de eso, verdad?). ¿Eso estaba relacionado con esto?

Además, parece que la función se está utilizando como operador? Al igual que arriba, no entiendo la sintaxis de la declaración en absoluto. Tal vez hay un contexto que ayudaría?

+0

Es el código de jQuery: http://code.jquery.com/jquery-1.4.4.js – Dexter

Respuesta

11

La envoltura hace una serie de cosas:

function(window,undefined) 

proporciona las variables window y undefined a la función

la llamada anónima })(window); pasa la variable de ventana en el guión.

Si un usuario anula el objeto de ventana, que podrán fácilmente para modificar la secuencia de comandos para utilizar la correcta window es decir, la variable:

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

La falta de un segundo parámetro que se pasa establece la variable undefined tener un valor de undefined que evita que un programador arruine jQuery anulando undefined.

+0

Ok, creo que entiendo (con la lectura agregada de esto: http://mpathirage.com/files /javascript_ninja/JavaScriptNinja_ch3_Article2.pdf. Entonces, ¿puedes manipular el objeto de ventana después de que jQuery se cargue, y no afectará al objeto de ventana llamado en esta función? – Dexter

+0

Creo que sería mejor que una aplicación se rompa, eso es algo tonto el desarrollador sigue pensando que está bien asignar un valor a 'undefined', a menos que la intención sea confundir a cualquiera que mire su código. – mikerobi

+0

@Dexter no del todo. Los objetos en JS se pasan por referencia (más o menos), por lo que la modificación del objeto de la ventana que se pasó a jQuery todavía tendrá efecto en la referencia que jQuery mantiene para el objeto de la ventana, pero le permite anular el objeto de la ventana con algún ob nuevo ject. es decir, 'window.foo = 'bar'' será accesible dentro de jQuery, pero' window = {foo:' bar '} 'no lo hará. – zzzzBov

Cuestiones relacionadas