Qu'est-ce que cela signifie que l'espace de noms global serait pollué?
Je ne comprends pas vraiment ce que signifie l'espace de noms global pollué.
javascript
theJava
la source
la source
Réponses:
Note rapide sur la collecte des ordures
À mesure que les variables perdent de leur portée, elles seront éligibles pour le garbage collection. S'ils sont étendus globalement, ils ne seront pas éligibles pour la collection tant que l'espace de noms global n'aura pas perdu sa portée.
Voici un exemple:
L'ajout de cela à votre espace de noms global (du moins pour moi) devrait ajouter 10 000 Ko d'utilisation de la mémoire (win7 firefox) qui ne seront pas collectés. D'autres navigateurs peuvent gérer cela différemment.
Alors que d'avoir ce même code dans une portée qui sort du champ d'application comme ceci:
Permettra
arra
de perdre de la portée après l'exécution de la fermeture et sera éligible pour le ramasse-miettes.L'espace de noms global est votre ami
Malgré les nombreuses réclamations contre l'utilisation de l'espace de noms global, c'est votre ami. Et comme un bon ami, vous ne devez pas abuser de votre relation.
Sois gentil
N'abusez pas (généralement appelé «polluant») de l'espace de noms global. Et ce que je veux dire par ne pas abuser de l'espace de noms global, c'est - ne pas créer plusieurs variables globales. Voici un mauvais exemple d'utilisation de l'espace de noms global.
Cela va créer 11 variables globales qui pourraient éventuellement être écrasées ou mal interprétées quelque part.
Soyez ingénieux
Une approche plus ingénieuse, qui ne pollue pas l'espace de noms global, consisterait à envelopper tout cela dans le modèle de module et à n'utiliser qu'une seule variable globale tout en exposant plusieurs variables.
Voici un exemple: (Veuillez noter que c'est simple et qu'il n'y a pas de gestion des erreurs)
la source
Calculate.prototype.Slope()
hors du périmètre? Il serait très parfait de comprendre un autre concept proche de cette problématique!En JavaScript, les déclarations en dehors d'une fonction sont dans la portée globale. Prenons ce petit exemple:
Dans l'exemple ci-dessus,
x
est déclaré dans la portée globale. Toute portée enfant, telle que celle créée par laexample
fonction, hérite effectivement des éléments déclarés dans toutes les portées parent (dans ce cas, il ne s'agit que de la portée globale).Toute portée enfant qui redéclarera une variable déclarée dans la portée globale occultera la variable globale, provoquant potentiellement des bogues indésirables et difficiles à suivre:
Les variables globales ne sont généralement pas recommandées en raison du potentiel de causer des problèmes comme celui-ci. Si nous n'avions pas utilisé l'
var
instruction dans laexample
fonction, nous aurions accidentellement écrasé la valeur dex
dans la portée globale:Si vous voulez en savoir plus et le comprendre correctement, je vous suggère de passer par la spécification ECMAScript . Ce n'est peut-être pas la lecture la plus excitante, mais cela ne servira à rien.
la source
Lorsque vous déclarez des variables globales, des fonctions, etc., elles, ehm, vont dans l'espace de noms global. Outre les problèmes de performances / mémoire (qui peuvent survenir), vous risquez de rencontrer des conflits de noms malheureux lorsque vous redéfinissez une variable importante ou n'utilisez pas la valeur que vous pensez utiliser.
Il faut éviter de définir des choses dans l'espace de noms global.
la source