Pregunta ¿Cuál es el propósito de pasar argumentos a las funciones anónimas de esta manera? [duplicar]


Posible duplicado:
¿Cómo funcionan los cierres de JavaScript? 

Estaba jugando con el Compilador de cierre de Google, colocando un código aleatorio para ver qué haría.

Reescribió una de mis funciones para que se vea así:

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

Donde parece que "Hello World" es el argumento pasado como msg a la función anónima que lo precede. Estuve mirando por un momento, y pensé que había visto algo similar en los complementos de jQuery que se parece a algo así como:

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

Lo que ahora tiene 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?


32
2017-10-02 21:23


origen


Respuestas:


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 limpio en términos de contaminación del 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 se necesita, 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 msg la variable estaría disponible en todas partes en la página, como variable global.


10
2017-10-02 21:27



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

Creo que el principal compilador de cierre de la sesión es guardar los 5 caracteres:var  y =.


0
2017-10-02 21:34



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!");

0
2017-10-03 01:02