Evitar referencias 'globales' en javascript

Tengo el problema de tener nombres de variables de código en conflicto entre sí, es decir;

<script type="text/javascript">var a = "hello"; </script>
<script type="text/javascript">alert(a);//this works, when I want 'a' not to exist </script>

¿Son los cierres la única opción?

Viniendo del fondo de ac#, es como construir una instancia sin referencia de un delegado, luego llamarlo en línea, lo que parece un poco complicado

(function(){var a = "hello";})();
(function(){alert(a);})();//yes! working as expected

preguntado el 12 de junio de 12 a las 15:06

5 Respuestas

El uso de una función (de ejecución automática inmediata) para crear un nuevo alcance es, de hecho, el camino a seguir.

Esto también tiene la ventaja de que puede asegurarse de que ciertas variables tengan ciertos valores. Al usar jQuery, lo siguiente es común, por ejemplo:

(function($, window, undefined) {
    // ...
})(jQuery, this);

A menos que tenga toneladas de funciones con una sola declaración en cada una (como en su ejemplo), también es perfectamente legible.

Respondido el 12 de junio de 12 a las 15:06

Sí, los cierres son su única opción. En los navegadores, todos los archivos JavaScript se colocan en el mismo ámbito global.

de IIFE se encuentran las lugar común en JavaScript; Yo no los llamaría desordenados.

Respondido el 12 de junio de 12 a las 15:06

Javascript , solamente tiene alcance de función, a diferencia de C# que tiene alcance de bloque. El siguiente código es javascript y C# válido:

var x = 2;
while(true) {
    var y = 3;
    break;
}
//y is not accessible here in C#, but is in javascript

La única forma de crear un nuevo ámbito es crear y ejecutar una función anónima.

Respondido el 12 de junio de 12 a las 15:06

Para abreviar, cosas en línea, entonces es mejor usar el patrón de módulo para crear un cierre y, por lo tanto, emular variables privadas.

(function(){
    var a....
    })();

Un mejor enfoque a largo plazo es usar objetos como espacios de nombres.

var NS = {};
NS.a = 1;

Respondido el 12 de junio de 12 a las 15:06

Sólo para proporcionar una perspectiva diferente. Es posible escribir código sin usar cierres y mantener (posiblemente) un alcance de variable global seguro.

  1. Defina un solo objeto, para usarlo como un espacio de nombres, con un nombre único adecuado (por ejemplo, MyAppContext) que tendrá un alcance global, y si necesita definir variables de tipo global solo para usar en su aplicación, adjúntelas a este objeto.

    MyAppContext.appTitle = 'Título de la aplicación';

  2. Al comienzo de su secuencia de comandos donde crea MyAppContect asegúrese de que ya no existe.

  3. Asegúrese de que todas sus variables con ámbito de función utilicen el var palabra clave para que sepa que no está haciendo referencia a un valor global.

Obviamente, este enfoque abre el riesgo de que olvide definir algunas de las variables de su función con var. JSLint te puede ayudar con respecto a esto.

Estoy feliz de retractarme de esta respuesta si empiezo a ser criticado, pero creo que es un enfoque alternativo viable para usar cierres. ¡Y oye! es de la vieja escuela

También estoy de acuerdo en que el uso de cierres es más seguro, pero pensé que esto podría interesarte.

Respondido el 12 de junio de 12 a las 16:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.