Question

Souvent, je vois un objet global défini dans le code javascript pour agir comme un espace de noms.

var MyNS = {a: function() {}, ... };

Mais parfois, je vois des gens laisser tomber le mot-clé « var » comme

MyNS = {a: function() {}, ...};

Je crois que dans les navigateurs Web si vous ne définissez pas une variable var, il est placé dans l'objet de la fenêtre, qui agit comme un espace de noms global. Comme il enregistre quelques octets de texte par ne pas utiliser « var » est-il une raison d'utiliser le mot-clé à cet effet spécifique

Était-ce utile?

La solution

  

Comme il enregistre quelques octets de texte par ne pas utiliser « var » est-il une raison d'utiliser le mot-clé à cette fin spécifique?

Je ne vous conseille pas d'éviter le mot-clé var, même si vous êtes sur le Code mondial.

Les deux méthodes semblent similaires mais en réalité ils ne sont pas les mêmes, la première est une Déclaration variable , Variable Object sur le code mondial, est l'objet global lui-même, c'est pourquoi les variables globales sont accessibles en tant que propriétés de l'objet global (window.MyNS).

Le second est un cession non déclarés , il crée une propriété sur l'objet global si l'identifiant ne se trouve pas dans la chaîne de portée.

Une vraie raison de l'éviter est que, dans la nouvelle norme de la langue, ECMAScript 5ème édition, sous mode strict , une affectation à un identificateur non déclaré lancera une ReferenceError briser votre code.

Il y a aussi une autre différence subtile entre vos deux exemples, l'instanciation variable crée la propriété sur l'objet global qui est non supprimable:

var myVar = '';
delete window.myVar; // false
typeof window.myVar; // 'string'

Bien que l'affectation non déclarées non:

myProp = '';
delete window.myProp; // true
typeof window.myProp; // 'undefined'

Article recommandé:

Autres conseils

L'utilisation de var définit une variable locale dans le cadre actuel. Si vous êtes dans la portée globale, ils sont effectivement équivalents. L'utilisation de var il y a plus de compréhensibilité et de maintenabilité, que l'intention est tout à fait claire. Il est moins clair sans initialiser le var.

Dans une portée locale, si MyNS est quelque part initialisés la chaîne de portée, vous remplacerez cette variable locale plutôt que de définir une variable globale.

Je pense qu'il est agréable d'utiliser le mot-clé, car il vous obtient l'habitude, et aide à prévenir les erreurs désagréables lorsque vous l'oubliez dans les corps de la fonction. Il est également agréable dans le cas où quelques trouvailles de code global se migrés en fonction.

Mais non, ce n'est pas strictement nécessaire.

modifier -. @Eyelidlessness a un très bon point, mais si vous avez le code de frappe au niveau mondial déjà ce n'est pas un problème

Un modèle assez pare-balles que j'ai vu est d'initialiser les espaces de noms global avec quelque chose comme ceci:

(function(window, undefined) {

  var foo = { stuff: "in my namespace", ... };

  window.foo = foo;
})(this);

Au niveau mondial, this sera l'objet de la fenêtre (si vous êtes dans un navigateur, sinon, il est tout ce que l'objet global est dans ce contexte).

Douglas Crockford sur cette question précise: http://www.yuiblog.com/blog / 2008/04/16 / global domination-partie-deux /

Il se dépose sur l'aide d'un commentaire avec l'initialisation, mais sans var. Son analyse des compromis mérite d'être lu même si vous n'êtes pas d'accord.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top