2011-07-01 6 views

Répondre

26

Ce sont des propriétés définies par le navigateur spécifique et ne sont pas définis par ECMAScript. Par conséquent, name collision doit être évitée. S'ils appelaient la propriété defineGetter, il n'y aurait aucune garantie que le code du site Web ne définisse pas déjà une propriété du même nom - et cela causerait beaucoup de problèmes. Cependant, l'ajout de deux traits de soulignement est devenu la manière de facto de définir les propriétés spécifiques du navigateur (car il est beaucoup moins probable que certains sites utilisent cette convention). Vous remarquerez peut-être que d'autres navigateurs utilisent la même convention de nommage que d'autres (comme __proto__), mais cela n'est pas encore universellement garanti entre tous les navigateurs (par exemple, IE ne définit pas le __proto__ property). En outre: la convention d'utilisation de deux caractères de soulignement pour les identificateurs "définis par le système" (par opposition aux identificateurs définis par le programmeur) revient très longtemps, donc je ne sais pas quand cette convention "a commencé" - Au moins aussi longtemps que C++ (voir http://en.wikipedia.org/wiki/Name_mangling#Simple_example)

+0

Donc, jusqu'à ici, double underscores est un standard _defacto_ des navigateurs, un soulignement est ce standard _defacto_ des bibliothèques (comme Microsoft.Ajax ou jQuery). Ai-je raison? –

+2

Je ne pense pas qu'il existe une convention globale sur la façon dont les frameworks définissent leurs variables. Pourtant, la "meilleure pratique" consiste à définir seulement 1 objet global (comme l'objet 'google' ou l'objet' jQuery'), puis à définir toutes vos méthodes/variables dans la portée de cet objet. Et c'est pour éviter exactement le problème de la collision de noms. Cependant, cela ne signifie nullement que chaque cadre le fait de cette façon. –

+0

En outre, les variables de navigateur ne sont souvent pas des variables globales du tout, comme le sont parfois les variables de structure. Ils sont normalement des propriétés ajoutées à chaque objet. Peut-être via 'Object.prototype' ou d'une autre manière. –

5

C'est ainsi que collision de nom serait très improbable.

JavaScript a ce problème avec l'espace de noms global que tout le monde peut changer ou accéder à n'importe quoi. Il existe des techniques de masquage de données mais parfois elles ne fonctionnent pas.

Par exemple, si vous faites cela, votre jquery cessera de fonctionner:

$ = "somethingElse"; 
+0

Mais est-ce une pratique recommandée, ou est-ce juste une sorte d'innovation, décidé par certains gourous gars? Je veux dire pourquoi commencer avec un trait de soulignement et rien d'autre, et pourquoi double soulignement, pas un? –

+3

Utilisation de deux caractères de soulignement pour les variables "définies par le système" et non Les variables définies par l'utilisateur remontent longtemps, donc je ne sais pas quand cette convention a "démarré" - Au moins aussi longtemps que C++ (voir http: // fr .wikipedia.org/wiki/Name_mangling # Simple_example) –

Questions connexes