Las variables globales son una mala idea. Solo deben usarse cuando sea absolutamente necesario. No hay beneficio de RAM ni nada de eso.
Lo que está hablando w3schools es The Horror of Implicit Globals. Considere esta función:
function foo() {
var x;
x = 5;
y = 6;
return x + y;
}
Cuando se ejecuta esta función, de repente, de la nada, tiene una variable global llamada y
. Esto se debe a que la función asigna al y
, pero y
no está declarado en ningún lado. A través de la mecánica de la cadena de ámbito en JavaScript, esto termina siendo una asignación implícita a una propiedad en el objeto global (al que puede acceder como window
en los navegadores). Por ejemplo, en el supuesto y
no se ha declarado en cualquier ámbito que contiene, es exactamente lo mismo que esto:
function foo() {
var x;
x = 5;
window.y = 6;
return x + window.y;
}
El objeto global contiene todas las variables globales (actualización que utiliza a, ES6 agregó una forma de declarar variables globales que no terminan en window
, ver la nota a continuación), ambos definidos explícita e implícitamente. Puede imaginarse que hay un lote de variables globales creadas por el código de las personas por accidente.
El objeto global ya está muy, muy desordenado. A menos que esté escribiendo una biblioteca o una página que tenga que usar varios archivos de script, no hay razón para complicar aún más el objeto global. Apenas define a sí mismo una función de alcance agradable y poner los símbolos en ella:
(function() {
var your, symbols, here, if_they_need, to_be_shared, amongst_functions;
function doSomething() {
}
function doSomethingElse() {
}
})();
Y si lo hace, es posible que desee invocar la nueva strict mode de JavaScript, añadido en el quinto especificación de edición:
(function() {
"use strict";
var your, symbols, here, if_they_need, to_be_shared, amongst_functions;
function doSomething() {
}
function doSomethingElse() {
}
})();
... que tiene la ventaja de (amongst other things) haciendo que la creación implícita de la función foo
de una variable global sea ReferenceError
.
Actualización: ES6 y globales: A partir de ES6, una nueva especie de la que se creó mundial no es una propiedad del objeto global: Globals crean a través de let
, const
, o class
. Esas palabras clave nuevas, cuando se utilizan en el ámbito global, crean globales que no se convierten en propiedades del objeto global y, por lo tanto, no se puede acceder a través de window
en los navegadores.
-1 debido a su primera oración. Las variables globales son una mala idea? ** ¿Siempre? ** No, a veces son una muy buena idea. Depende de para qué los uses. Odio declaraciones universales como esta que no son verdaderas; no pertenecen a la programación. – Andrew
@Andrew: Podría darme crédito por la * segunda * oración, entonces. ¿Seguramente el resto de la respuesta compensa tus problemas con la primera oración? –
Su segunda oración complementa la primera, entonces no. Las variables globales no son una mala idea, a menudo son una mala idea.No solo deben usarse cuando sea absolutamente necesario, sino que deben usarse siempre que sea apropiado para que la memoria sea accesible globalmente. Y lo siento, no, "use strict" no es una solución típicamente ideal para JavaScript, a menos que lo esté usando globalmente para algo más oficial como TypeScript; de lo contrario, es un truco que debes mantener constantemente (colocándolo en todas partes) para asegurarte de que no escribes un código incorrecto, contradictorio. – Andrew