Por que as variables ​​globais são consideradas más práticas?

Eu continuo vendo avisos para não usar variables ​​globais em JavaScript, mas parece que a única razão pela qual as pessoas dizem isso é porque entope o namespace global. Eu posso imaginar isso sendo facilmente corrigido colocando todas as variables ​​em um grande object. Agora a questão é: existem outras razões para não usar variables ​​globais além do bem de conveniência? Há algum problema de desempenho ou compatibilidade envolvido com eles?

Eles entopem o namespace global e são mais lentos para procurar do que variables ​​locais.

Primeiro de tudo, ter muitas variables ​​globais é sempre uma coisa ruim porque é fácil esquecer que você declarou uma variável em algum lugar e acidentalmente a declara novamente em outro lugar. Se sua primeira variável era local, você não tem problema. Se fosse global, então foi substituído. Isso fica ainda pior quando você entra em globals implícitos (por exemplo, quando você diz someVar = someValue sem declarar someVar com a palavra-chave var ).

Em segundo lugar, as variables ​​globais levam mais tempo para o JavaScript “localizar” do que as variables ​​locais. A diferença de velocidade não é enorme, mas existe.

Para uma leitura mais aprofundada e uma explicação mais detalhada de por que as globais são consideradas práticas ruins, você pode querer verificar essa página .

As variables ​​globais podem aumentar significativamente o acoplamento, reduzindo significativamente a escalabilidade e testabilidade do seu código. Depois de começar a usar globals, você agora precisa saber onde e como a variável é modificada (por exemplo, quebrar o encapsulamento). A maior parte da literatura e convenções lá fora, argumentam que o desempenho é a menor das suas preocupações quando se usa globals.

Este é um artigo fantástico descrevendo porque as variables ​​globais causam dores de cabeça.

Se seu script for muito longo e você usar essas variables ​​de várias funções, isso aumentará seu tempo de debugging, já que o valor da variável global poderia ter sido alterado de qualquer lugar, portanto, se você estiver rastreando onde isso mudou para um valor não esperado, você Vou ter que verificar todos eles.

Esse cenário é ainda mais doloroso se diferentes programadores modificarem essa variável de outros scripts incluídos em sua página.

Em suma, as variables ​​globais causam (e mais) os seguintes problemas.

1) Colisões de nomenclatura variables ​​- Se você estiver trabalhando em uma equipe e você e seu colega de trabalho usarem o mesmo nome de variável no escopo global, a variável definida por último sobrescreverá a variável inicial. Esse óbvio pode ter consequências devastadoras.

2) Segurança – Especificamente na web, todo usuário tem access ao object Window (ou global). Colocando variables ​​no escopo global, você dá a qualquer usuário a capacidade de ver ou alterar suas variables.

3) Mais lento – Isto é discutivelmente insignificante, mas ainda existe. A maneira como as pesquisas de variables ​​JavaScript funcionam é que o mecanismo JavaScript fará uma pesquisa no escopo atual em que a variável está sendo pesquisada. Se não puder encontrá-lo, ele consultará o próximo escopo pai. Se não encontrar, continuará olhando para cima até atingir o object global procurando por aquela variável. Se todas as variables ​​estiverem localizadas no escopo global, o mecanismo JavaScript sempre terá que passar por todos os escopos para finalmente alcançar o escopo global para encontrar a variável.

Não deve haver nenhum problema ao usar variables ​​globais em seu código, desde que você esteja agrupando-as dentro de uma namespase / object uniqe (para evitar a colisão com scripts que não são seus)

Há um advento de usar variables ​​globais em javascript e deriva do fato de que o javascript não é uma linguagem de tipos forte. lá para, se você passar alguns objects complexos como argumentos para uma function, você provavelmente perderá toda a inteligência para esses objects (dentro do escopo da function) enquanto estiver usando objects globais, preservará essa intellisence. e quando você tem inteligência, na verdade, pode melhorar o tempo de debugging (em oposição ao que os outros disseram …)

Eu pessoalmente acho isso muito útil e certamente tem lugar no meu código.

(claro, deve-se sempre fazer o equilíbrio certo entre variables ​​locais e globais)

Basicamente, porque eles podem ser acessados ​​de qualquer script na página e porque você pode repetir seu nome no mesmo escopo. É por isso que muitos mecanismos de Javascript usam 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'