Je continue à voir des avertissements de ne pas utiliser de variables globales dans JavaScript, mais il semble que la seule raison pour laquelle les gens disent que c'est parce que cela obstrue l'espace de noms global. Je peux imaginer que cela soit facilement résolu en plaçant toutes les variables dans un seul et même grand objet. La question qui se pose maintenant est la suivante: existe-t-il d'autres raisons de ne pas utiliser de variables globales autres que la commodité? Existe-t-il des problèmes de performances ou de compatibilité?
Ils encombrent l'espace de noms global et sont plus lents à rechercher que les variables locales.
Tout d'abord, avoir plusieurs variables globales est toujours une mauvaise chose car il est facile d'oublier que vous avez déclaré une variable quelque part et que vous la re-déclariez accidentellement ailleurs. Si votre première variable était locale, vous n'avez pas de problème. Si c'était global, alors ça vient d'être écrasé. Cela devient encore pire lorsque vous entrez dans les globales implicites (par exemple, lorsque vous dites someVar = someValue
sans déclarer someVar avec le mot clé var
).
Deuxièmement, les variables globales mettent plus de temps à "trouver" que les variables locales. La différence de vitesse n’est pas énorme, mais elle existe.
Pour une lecture plus approfondie et une explication plus détaillée des raisons pour lesquelles les globaux sont considérés comme une mauvaise pratique, vous pouvez consulter cette page .
Les variables globales peuvent considérablement augmenter le couplage et réduire considérablement l'évolutivité et la testabilité de votre code. Une fois que vous commencez à utiliser les globales, vous devez maintenant savoir où et comment la variable est modifiée (c.-à-d. Briser l’encapsulation). La plupart des publications et des conventions suggèrent que la performance est le moindre de vos problèmes lorsque vous utilisez des globals.
Ceci est un article fantastique expliquant pourquoi les variables globales provoquent des maux de tête.
Si votre script est très long et que vous utilisez ces variables à partir de nombreuses fonctions, il augmentera votre temps de débogage car la valeur de la variable globale pourrait avoir été modifiée de n'importe où. Par conséquent, si vous faites un suivi sur une valeur non attendue, vous ' Je vais devoir tous les vérifier.
Ce scénario est encore plus pénible si différents programmeurs modifient cette variable à partir d’autres scripts inclus dans votre page.
En bref, les variables globales causent (et plus) les problèmes suivants.
1) Collisions de dénomination de variables - Si vous travaillez dans une équipe et que votre collègue et vous-même utilisez le même nom de variable dans l'étendue globale, la dernière variable définie écrasera la variable initiale. Cette évidence peut avoir des conséquences dévastatrices.
2) Sécurité - Spécifiquement sur le Web, chaque utilisateur a accès à l’objet Window (ou global). En plaçant des variables sur la portée globale, vous donnez à tout utilisateur la possibilité de voir ou de modifier vos variables.
3) Plus lent - Ceci est sans doute négligeable, mais il existe toujours. La façon dont les recherches de variables JavaScript fonctionnent est que le moteur JavaScript effectue une recherche sur l'étendue actuelle dans laquelle la variable est recherchée. Si elle ne le trouve pas, elle effectuera une recherche sur l'étendue parent suivante. S'il ne le trouve pas, il continue à regarder vers le haut jusqu'à atteindre l'objet global à la recherche de cette variable. Si toutes vos variables sont situées dans la portée globale, le moteur JavaScript devra toujours parcourir toutes les portées pour atteindre la portée globale afin de trouver la variable.
Il ne devrait y avoir aucun problème à utiliser des variables globales dans votre code tant que vous les enveloppez dans un seul nom/objet (pour éviter les collisions avec des scripts qui ne vous appartiennent pas)
L'utilisation d'une variable globale en javascript présente un certain risque: elle découle du fait que javascript n'est pas un langage de type fort. car si vous transmettez des objets complexes en tant qu’arguments à une fonction, vous perdrez de manière prévisible toute l’intellisence de ces objets (à l’intérieur de la portée de la fonction) tout en utilisant des objets globaux à la place, préservera cette intellisence. et quand vous avez de l'intellisence, cela peut réellement améliorer le temps de débogage (contrairement à ce que d'autres ont dit ...)
Personnellement, je trouve cela très utile et cela a certainement sa place dans mon code.
(bien sûr, il faut toujours faire le bon équilibre entre les variables locales et globales)
En gros, ils sont accessibles à partir de n’importe quel script de la page et vous pouvez répéter le nom dans le même champ. C'est pourquoi beaucoup de moteurs Javascript utilisent ce code:
(function(){
var foo = 'foo',//Local
bar = 'bar';//Local
window.globalVar = foo + bar;//Global
})();
alert(foo);//Error
alert(bar);//Error
alert(globalVar );//'foobar'
La variable globale que vous avez créée peut remplacer les propriétés de l’objet window existant. Parce que les variables globales accèdent dans un contexte global, c’est-à-dire un objet window.