2012-10-02 10 views
28

Duplicar posible:
How do JavaScript closures work?¿Cuál es el propósito de pasar argumentos a las funciones anónimas de esta manera?

yo estaba jugando un poco con el Google Closure Compiler, poniendo en código aleatorio para ver lo que iba a hacer.

reescribió una de mis funciones a ser algo como esto:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

Cuando resulte que "Hello World" es el argumento que se pasa como msg a la función anónima que le precede. Estaba mirando por un momento, y había pensado que había visto algo similar en plugins jQuery que miran algo como:

(function($) { 
    ... 
})(jQuery); 

que ahora hace más sentido para mí, en el ámbito de los conflictos con $. Pero, ¿cuál es la razón principal o el propósito para pasar argumentos a una función anónima como esta? ¿Por qué no definirías simplemente los argumentos como variables dentro de la función? ¿Hay alguna ventaja de rendimiento o flexibilidad para escribir funciones como esta?

+0

Para ese código específico, no existe un motivo real. Simplemente podría hacer 'console.log (" hello ");'. Pero generalmente es para crear algunas variables locales que solo son accesibles para algunas funciones que se crean dentro y se exportan. –

+0

Me gustaría ver el código original que dio como resultado ese formulario. Apuesto a que si tuvieras ADVANCED_OPTIMIZATIONS habilitadas, eliminaría por completo la función. –

+0

@ user1689607 la función era un poco diferente y mucho más larga.Lo hice breve para hacerlo limpio en SO. Más preguntas sobre el concepto que este ejemplo específico –

Respuesta

10

Hay una diferencia significativa relacionada también con el alcance. El siguiente código:

(function(msg) { console.log(msg); })("Hello World!");​​​​​​​ 

es en algunas circunstancias más limpios en términos de contaminación espacio de nombres que esto:

var msg = "Hello World!"; 
console.log(msg); 

porque el segundo código deja variable después de que ya no es necesaria, pero puede interferir con otras partes del código

Esto es especialmente importante cuando ejecuta el código mencionado fuera de cualquier otra función: en tal caso, la variable msg estaría disponible en todas partes en la página, como variable global.

+0

Pero, ¿cómo sería diferente entonces simplemente envolviendo su segundo ejemplo en una función anónima? la variable aún moriría al final –

+0

Tenía la impresión de que quería decir algo como esto: http://jsfiddle.net/cv5Jp/ –

+0

@KevinB ¿Cuál es la diferencia entre tu violín y la función que publiqué? –

0

Básicamente, siempre es una buena idea mantener su código envuelto en esto: (function(){/*code*/}()); para evitar que sus vars colisionen con los vars de otras personas.

Creo que el principal compilador de cierre está consiguiendo guardar los 5 caracteres: var  y =.

0

Depende un poco del contexto. Hay algunas condiciones en las que el compilador no intentará alinear ninguna función en absoluto (si la función de alcance contiene "eval", por ejemplo). Si se trata de un alcance global y se está ejecutando en modo AVANZADO, es simplemente que la oportunidad de publicación apareció después de que el compilador dejara de intentar las funciones en línea (o hay un error en el código de entrada y se perdió la oportunidad). Si ejecuta su salida de muestra a través del compilador en modo AVANZADO, obtendrá esto:

console.log("Hello World!"); 
Cuestiones relacionadas