Quelle est la différence entre un mondial de la var et de la fenêtre.variable en javascript?
Je suis en train de lire le backbone.js documents et de voir beaucoup de code qui affecte les attributs de la fenêtre de l'objet:
window.something = "whatever";
quelle est la différence entre l'appel de ce code, et juste de l'affectation de la variable et de la création d'un mondial var, comme ceci:
something = "whatever";
je suppose, est une sorte de portée différente, et/ou le propriétaire de l'objet différence (fenêtre étant le propriétaire vs pas) mais je suis intéressé dans le détail entre les deux et pourquoi je voudrais utiliser la fenêtre de vs de ne pas l'utiliser.
- Ce n'est pas vraiment liée à votre cas particulier, mais rappelez-vous que Javascript n'est pas nécessaire de les exécuter dans un navigateur, si la fenêtre n'a pas à être défini.
Vous devez vous connecter pour publier un commentaire.
Pas de différence. Ils ont le même effet (Dans le navigateur, où
window
est le contexte global1).window.foo = "bar"
définit la propriétéfoo
surwindow
.foo = "bar"
indique une faute de frappe ou intentionnellement mondiale.Depuis que j'ai à double vérifier si c'est une faute de frappe ou pas, personnellement, je trouve cela plus lisible pour définir
window.foo
directement.Aussi, dans l'ES5 mode strict,
foo = "bar"
illégale est une tâche parcefoo
n'est pas déclarée et va jeter unError
.Edit:
Comme indiqué dans les commentaires,
foo = "bar"
va regarder tout le chemin jusqu'à la chaîne d'étendue pour la variablefoo
et de la réaffectation des il avec"bar"
s'il est trouvé. Si il ne l'est pas, il va créer une nouvelle variable globale.Aussi avec
window.foo = "bar"
vous êtes juste à l'attribution d'une propriété à un objet, qui peut être supprimé à l'aide dedelete window.foo
.Dans l'ES5 mode strict, il est invalide à
delete
une variable.1 Dans d'autres environnements, tels que node.js Web et de Travailleurs, il y a peut être un autre nom pour l'objet global et
window
peut ne pas exister du tout. Node.js utiliseglobal
Web et les Travailleurs utilisentself
.window.foo = bar;
jeux de foo sur l'objet window.foo = bar;
recherches de la portée de la chaîne jusqu'à ce qu'il trouvefoo
, ce qui peut finir par être l'objet global, mais pas toujours.window
est l'objet global, le comportement @kennebec décrit est correct. Les anciennes versions d'IE ne sont pas conformes, cependant.Ils les deux de faire la même chose.
Mais en accédant à un
window
bien, vous savez certainement que vous avez accès à une variable globale n'importe quel champ d'application que vous utilisez.Par exemple :
En d'autres termes, Si vous voulez travailler avec des variables globales, c'est un peu plus sûr de l'accès par l'intermédiaire de leur conteneur :
window.variable
La clé, comme Raynos fait allusion, c'est que c'est explicitement définie sur l'objet window. Dans le navigateur, l'objet global est le même que l'objet de la fenêtre, mais dans d'autres environnements (p. ex. node.js ou peut-être en cours d'exécution en mode web, de la sorte, sur un appareil mobile), il ne peut pas.
La différence est que
window.foo = bar;
ne peuvent pas être interceptées par refactoring fait plus tard.À l'aide de
foo = bar;
signifie que si, à une date ultérieure, le code est déplacé dans une clôture oùvar foo
a été défini, il ne sera plus fixé sur l'objet global.Ajouter un point de plus:
Si vous vous référez un variable non déclarée directement (sans utiliser - fenêtre ou typeof), puis vous obtiendrez une variable n'est pas définie erreur.
Exemples:
En suspens références (aka les variables non déclarées) sont en fait pas des variables, ils sont ajoutés en tant que propriété de l'objet global. [5c]
En mode strict ("use strict"), les références jeter un ReferenceError. C'est pour éviter l'ajout de propriétés de l'objet global qui étaient censés être des variables déclarées. Dans ce cas, si vous ne souhaitez pas ajouter une propriété à l'objet global, vous utilisez la fenêtre.foo = "bar". [5a]