¿Cuál es el propósito de pasar argumentos a 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 , poniendo código aleatorio para ver qué haría.

Reescribió una de mis funciones para que se viera algo como esto:

(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 le precede. Yo estaba mirando por un momento, y había pensado que había visto algo similar en jQuery plugins que se ven algo así como:

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

Que ahora tiene más sentido para mí, en el alcance 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?

Author: Community, 2012-10-03

3 answers

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 es necesario, pero puede interferir con otras partes del código.

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

 11
Author: Tadeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-02 21:27:39

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

Creo que lo principal a lo que está tratando de llegar el compilador de closure es guardar los 5 caracteres:var  y =.

 0
Author: Devin G Rhode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-02 21:34:50

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

console.log("Hello World!");
 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-03 01:02:57