El punto de esto es que las variables declaradas en las cosas interesantes no se crearán en el espacio de nombres global. Cualquier función en javascript creará dicho alcance. Supongamos que tiene algún javascript que desea ejecutar. Si hace esto:
var b = 1;
// stuff using b
Y algún otro código utiliza b, obtendrá el valor que sobra. (O, lo que es peor, si algún otro código establece b antes de que se ejecute su código, luego intenta obtener su valor anterior más tarde, lo habría cambiado mientras tanto.)
Por otro lado, si tiene este código, que declara y después llama a la función:
function a() {
var b = 1;
}
a();
y algún otro código más adelante utiliza b, no va a ver a sus valores, ya que b es local a la función. El problema con esto, por supuesto, es que todavía estás haciendo un nombre global, "a", en este caso. Por lo tanto, queremos una función sin nombre: esta es la razón por la que obtienes el código que describes. Declara una función sin nombre, y luego la llama.
Por desgracia, no se puede simplemente decir:
function() { ... }()
porque esto será analizado como una declaración de la función declaración, y luego un error de sintaxis. Al envolver la declaración de función entre paréntesis, obtiene una función expresión, que luego se puede llamar. Lo llama como cualquier otra expresión de función (como a, arriba), usando el segundo conjunto de parens. Por ejemplo, si la función tomara argumentos, los pasaría allí:
(function(a) { ... })(1)
Excepto, por supuesto, que entra en conflicto con el nombre de su función. –
Uh, sí. Es por eso que normalmente se hace con una función anónima. Acabo de utilizar una función con nombre para mostrar una forma más familiar que hace lo mismo. –
jder tiene la mejor respuesta para quienes llegan tarde a la fiesta. – Triptych