¿Cuáles son los beneficios de escribir código / variables Javascript globales como una función ejecutada en línea?

Debido a que está utilizando una función anónima de ejecución automática, puede controlar lo que entra y sale y comenzar a escribir código de manera modular. Lo que se ha convertido en la norma para CommonJS (un estándar para los módulos Javascript) es que escriba su código en pequeños módulos que cada uno solo exporta una cosa y básicamente solo hace una cosa. Una vez que pegue todos estos módulos juntos, puede hacer algo más grande con piezas más pequeñas. Esto es imposible de hacer sin un alcance global, y conduce a un mejor código (¡menos espagueti!).

Hay varios otros beneficios. Podemos definir parámetros y pasarlos (como lo hizo con jQuery), lo que nos permite controlar las variables solo en un ámbito. Lo que se ha convertido en una buena práctica es hacer algo como esto. Paul Irish llama a esto “protección contra el efecto Asshole”.

  (función (ventana, documento, indefinido) {
     document.getElementById ('x');
 }) (ventana, documento);

Nos aseguramos de que todas las variables que estamos usando sean las variables que queremos. ‘undefined’ permanece ‘undefined’, porque no hemos dado un parámetro en ese caso. Además, podemos minificarlo:

  (función (a, b, indefinido) {b.getElementById ('x');}) (ventana, documento);

Algo que no podríamos hacer en ningún otro lado. Puede obtener más información sobre por qué esto se hace en la biblioteca jQuery, entre otros.

Quiero volver a CommonJS por un segundo, porque probablemente así es como va a escribir código en el futuro, por lo que no tendrá que preocuparse por las cosas de ejecución automática.

  // Consigamos algunas cosas de otros módulos
 var $ = require ('jquery');
 var a = require ('./ a.js');

 // Esto generalmente es una mala idea, pero sigue siendo cómo hacemos que las cosas sean globales.
 global. $ = $;

 // ¿Qué les vamos a dar a otros módulos cuando nos requieran ()?
 module.exports = function () {
     hacer algo() ...
 }

Hay algunas bibliotecas, como gluejs, onejs y browserify que le permiten escribir su código en el lado del cliente con módulos y compilarlo en un archivo, como ya se hizo con node.js. Algunas personas también usan AMD, otra forma de definir módulos, pero me mantengo alejado porque ya uso node.js, que usa la definición de módulo CommonJS.

Se espera que en ES6 (esencialmente la próxima versión de Javascript) que los módulos se conviertan en estándar con una sintaxis estándar y que los globales sean más difíciles de hacer.

Ah, y coffee-script encierra su JS compilado por defecto.