2012-05-09 22 views
29

Sigo viendo advertencias de no usar variables globales en JavaScript, pero parece que la única razón por la que la gente dice eso es porque obstruye el espacio de nombres global. Me imagino que esto se soluciona fácilmente al poner todas las variables en un gran objeto. Ahora la pregunta es: ¿hay alguna otra razón para no usar variables globales que no sean de conveniencia? ¿Hay algún problema de rendimiento o compatibilidad involucrado con ellos?¿Por qué las variables globales se consideran malas prácticas?

+2

posible duplicado de [¿Por qué son globales malos?] (Http://stackoverflow.com/questions/4246284/why-are-globals-bad) y [otras preguntas] (http://stackoverflow.com/search? q = javascript + por qué + son + global + variables + malo). –

+2

JavaScript u otros idiomas, importa menos. Aquí está la [respuesta canónica a por qué los globales son malos] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –

Respuesta

36

Abarrotan el espacio de nombres global y son más lentos de buscar que las variables locales.

En primer lugar, tener muchas variables globales siempre es malo, ya que es fácil olvidar que has declarado una variable en algún lugar y accidentalmente volver a declararla en otro lugar. Si su primera variable era local, entonces no tiene un problema. Si fue global, entonces se sobrescribió. Esto empeora cuando ingresas en globales implícitos (por ejemplo, cuando dices someVar = someValue sin declarar someVar con la palabra clave var).

En segundo lugar, las variables globales tardan más tiempo en "encontrar" las variables locales. La diferencia de velocidad no es enorme, pero existe.

Para obtener más información y una explicación más detallada de por qué los globales se consideran malas prácticas, es posible que desee consultar this page.

0

Básicamente, porque se puede acceder desde cualquier secuencia de comandos en la página y porque puede repetir su nombre en el mismo ámbito. Es por eso que una gran cantidad de motores de JavaScript utilizar este código:

(function(){ 
    var foo = 'foo',//Local 
    bar = 'bar';//Local 
    window.globalVar = foo + bar;//Global 
})(); 
alert(foo);//Error 
alert(bar);//Error 
alert(globalVar);//'foobar' 
5

Si el guión es muy largo y utiliza estas variables a partir de una gran cantidad de funciones además de aumentar su tiempo de depuración ya que el valor de la variable global que podría haber sido cambiado desde cualquier lugar, de modo que si realiza el seguimiento de dónde esto cambió a un valor no esperado, deberá verificarlos todos.

Este escenario es aún más doloroso si diferentes programadores modifican esta variable desde otros scripts incluidos en su página.

+2

La depuración más ardua es solo una de las razones por las cuales los globales son malos. Otros están listados en [¿Por qué los globales son tan malvados?] (Http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –

2

No debería haber ningún problema al utilizar variables globales en el código todo el tiempo que les está envolviendo el interior de un namespase UNIQE/objeto (para evitar la colisión con los scripts que no son el suyo)

hay uno de adventage usando la variable global en javascript, y se deriva del hecho de que javascript no es un lenguaje de tipo fuerte. allí, si pasa algunos objetos complejos como argumentos a una función, perderá toda la inteligencia de esos objetos (dentro del alcance de la función) mientras usa objetos globales insteads, preservará esa intelliscencia. y cuando tienes intelisence, en realidad puede mejorar el tiempo de depuración (en comparación con lo que otros dijeron ...)

Personalmente me parece muy útil y ciertamente tiene lugar en mi código.

(por supuesto, uno debe hacer Alwayse el equilibrio adecuado entre los locales y las variables globals)

9

Las variables globales pueden aumentar significativamente acoplamiento, reduce significativamente la escalabilidad y la capacidad de prueba de su código. Una vez que comience a usar globales, ahora debe saber dónde y cómo se modifica la variable (es decir, la encapsulación de ruptura). La mayoría de la literatura y las convenciones argumentarán que el rendimiento es la menor de sus preocupaciones cuando se utilizan globales.

Esto es un fantastic article outlining why variables globales causan dolores de cabeza.

+3

Esta es la mejor respuesta. –

2

En pocas palabras, las variables globales causan (y más) los siguientes problemas.

1) Colisiones de nombres variables: si trabaja en equipo y tanto usted como su compañero de trabajo usan el mismo nombre de variable en el ámbito global, la variable definida al final sobreescribirá la variable inicial. Esto obvio puede tener consecuencias devastadoras.

2) Seguridad: específicamente en la web, cada usuario tiene acceso al objeto Ventana (o global). Al poner variables en el alcance global, le da a cualquier usuario la posibilidad de ver o cambiar sus variables.

3) Más lento: esto es discutiblemente insignificante, pero todavía existe. La forma en que funcionan las búsquedas de variables de JavaScript es que el motor de JavaScript hará una búsqueda en el ámbito actual en el que se busca la variable. Si no puede encontrarla, buscará en el siguiente ámbito principal. Si no lo encuentra allí, continuará mirando hacia arriba hasta que llegue al objeto global que busca esa variable. Si todas sus variables se encuentran en el alcance global, el motor de JavaScript siempre tendrá que pasar por todos los ámbitos para finalmente alcanzar el alcance global para encontrar la variable.

Cuestiones relacionadas