Evitar referencias 'globales' en javascript
Frecuentes
Visto 87 veces
4
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
5 Respuestas
6
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
2
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
0
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
0
Sólo para proporcionar una perspectiva diferente. Es posible escribir código sin usar cierres y mantener (posiblemente) un alcance de variable global seguro.
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';
Al comienzo de su secuencia de comandos donde crea
MyAppContect
asegúrese de que ya no existe.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 javascript or haz tu propia pregunta.