Avisar de contenido inadecuado

Por qué no conviene usar variables globales en Javascript

{
}

Desde hace tiempo vengo leyendo en muchos blogs de desarrollo con Javascript la recomendación de no utilizar variables globales en nuestro código. Pero ¿por qué se recomienda no utilizar variables globales en Javascript?

En pixelovers hemos querido ahondar un poco en esta cuestión y para ello comenzaremos respondiendo a algunas preguntas:

  • ¿Qué son las variables globales?

    En Javascript los programas son entregados como texto. Este texto Javascript es evaluado (eval) y compilado en un ejecutable que se ejecuta inmediatamente. Esta ejecución puede dejar algunos elementos en el objeto global de la ventana.

    El objeto global es el espacio de memoria que contiene las funciones y variables que estan en la raiz. Las variables que no se definen específicamente tambien son consideradas como variables globales. Los nombres de estas variables se mantienen en el objeto global y sus valores son accesibles desde cualquier parte del código.

  • ¿Si no es recomendable el uso de variables globales en Javascript por qué existen?

    Este uso de variables globales era conveniente para los pequeños scripts que Navigator 2 esperaba soportar. Con el tiempo, estos pequeños script han derivado en complejas aplicaciones Web 2.0 (POO, AJAX, uso de librerias, plugins, etc...)  por lo que el uso de variables globales ya no tiene justificación.

 

Global variables are evil.

Las variables globales son una fuente de falta de fiabilidad y de inseguridad. Su uso hace que se incremente el riesgo de colisiones con otras variables de otros programas. El riesgo de colisiones es mayor, cuantos mas librerias, plugins y widgets utilizemos.

De hecho, una medida objetiva de la calidad de un programa Javascript es: ¿Cuantas variables globales y funciones globales tiene? Cuantas mas tenga, de peor calidad es

Veamos ahora las diferentes formas de crear variables globales asi como la mejor alternativa a su uso.

Hay 3 maneras de definir una variable global en Javascript:

  • La primera forma es declarar la variable fuera de cualquier funcion

    			
    var myGlobalVar = value;
  • La segunda forma es asignar la variable como una propiedad del objeto global que en los navegadores web es el objeto window

    			
    window.myGlobalVar = value;
  • La tercera forma es usar la variable directamente sin definirla antes. En este caso no importa si la variable está dentro o fuera de una funcion. Se considera implícitamente que es una variable global

    			
    myGlobalVar = 'Hello world';

Una buena manera de minimizar el uso de variables globales es almacenarlas en un único objeto global. Haciendo esto puedes mantener todas tus variables y funciones en un único lugar, reduciendo ampliamente el riesgo de colisiones de nombre.

			
// Define your global object
var myObj = {};

// Add property (variable) to it
myObj.myVar = 'Hello world';


// Add method to it
myObj.myFunctions = function() {
// Do cool stuff
};

Idealmente, un aplicación, librería, componente o widget define una unica variable global. Esta variable global deberia ser un objeto que es el namespace raiz de toda nuestra funcionalidad (funciones y variables)

El lenguaje javascript se diseñó con variables globales para hacer más facil a los principiantes empezar a programar con este lenguaje. Pero el efecto colateral es que es facil olvidar definir una variable y de esta forma crear un bug difícil de descubrir. Asi que hazte un favor, y evita el uso de variables globales siempre que sea posible.

¿Y tu que opinas? ¿Alguna idea más para comentar respecto al uso de variables globales o alternativas?. Esperamos vuestros comentarios.

Enlaces y más

{
}
{
}

Comentarios Por qué no conviene usar variables globales en Javascript

Las variables "globales" son variables que se guardan en el scope de Windows, todas las variables vista desde un digmos script hijo puede ver las variables definida en su padre, cuando se ejecuta un script al momento de descargarse las deficiones se hacen en el scope mas alto (Windows) quedando como globales, para prevenir esto, yo trato de hacer una practica heredada de c, al inicio de cada funcion que se cree, definir la lista de variables que utlizaremos dentro de ella, algunas veces si requieres el acceso del scope a un elemento superior, pero ya alli depende de la programacion que estes realizando.
function myFunction(){
var n1,n2, var3;
//tu codigo...
}
con esa sencilla practica te evitaras varios dolores de cabeza, que en verad son dificiles de encotrar, yo ya traia esta practica y alguna vez en mi trabajo dentro de un ciclo redefini una variable "i", y dure un buen rato en encontrar el error ya que en cada interacion esa "i" me afectaba otra "i" que no estava viendo yo, y todo por no anteceder "var"
pakos pakos 30/03/2010 a las 01:17
ha y no creo esto "Con el tiempo, estos pequeños script han derivado en aplicaciones Ajax por lo que el uso de variables globales ya no tiene justificación." sea un motivo, mas bien creo son las malas constubres de que permiten hacer los leguajes amigables, este tema es sobre los scopes (alcance de variable) que no veo la relacion con AJAX, aunque este tipo de implementaciones de JS, suelen exijir un mejor manejo de la Orientacion a Objetos dentro de JS, y no necesariamente una aplicacion tiene que manejar AJAX para requerir que sus variables sean locales a sus funciones, puedo tener aplicaciones sin ningun XHR, completita bien formada con buenas practicas, mas bien el problema surgio que nunca se crello en JS como un leguaje para desarrollar profesionalmente, siempre fue un leguaje de jugete, y repleto de copy/paste de novatos
pakos pakos 30/03/2010 a las 01:21
@Pakos, gracias por el aporte y por la aclaración.

Efectivamente, al decir aplicaciones AJAX me refiero a aplicaciones web 2.0 (POO, AJAX, librerias, plugins, etc..).  Ya está corregido en el texto para que no haya lugar a confusión. :-)
@Juanma Garrido La traducción correcta no es 'librerías', sino 'bibliotecas'.
Fran Fran 13/06/2012 a las 09:47

Deja tu comentario Por qué no conviene usar variables globales en Javascript

Identifícate en OboLog, o crea tu blog gratis si aún no estás registrado.

Avatar de usuario Tu nombre