Sur le Web, je vois un grand nombre de programmeurs JavaScript écrire window.location
Au lieu de simplement location
. J'étais curieux de savoir si quelqu'un pouvait expliquer pourquoi. window
est l'objet global, et il n'est donc pas nécessaire de l'inclure - n'est-ce pas? Je veux dire, vous ne voyez pas les gens écrire window.Math.floor
Ou new window.Date()
, donc je suis curieux de savoir pourquoi cela serait spécifié avec location
.
Je comprends que location
est considéré comme une "propriété" de la fenêtre dans laquelle vous vous trouvez, ce qui, je suppose, a un certain sens. Mais même ainsi, je ne vois aucune raison de spécifier l'objet global; il n'est pas possible d'écraser location
en premier lieu, non sans rediriger la page.
Alors, est-ce juste une bizarrerie qui a été utilisée pendant si longtemps qu'elle est devenue intégrée à la façon dont nous écrivons JavaScript, ou y a-t-il une raison tangible de faire les choses de cette façon? J'ai vérifié Google, mais hélas, je n'ai rien trouvé ...
J'utilise toujours window.location
dans mon code pour deux raisons principales:
window.
le préfixe me rappelle que la variable est globale et que les autres ne le sont pas.var location
quelque part dans une portée contenante (il n'est pas improbable que Word utilise comme nom de variable) et vous y travailleriez à la place.Pour moi, la clarté de l'objectif lors du codage est très importante car elle m'aide à éviter d'écrire des bogues et m'aide à les trouver quand je le fais.
En partie pour la sécurité au cas où quelqu'un définirait une variable location
quelque part dans la chaîne de portée. les window.location
en fait une référence explicite à la propriété de window
.
Exemple: http://jsfiddle.net/dr6KH/
(function() {
var location = 'new value'; // creating a local variable called "location"
(function() {
alert(location); // alerts "new value"
alert(window.location); // alerts the toString value of window.location
})();
})();
Il y a une grande différence entre window.location
et les objets natifs Math
et Date
, c'est-à-dire que Math
et Date
sont des objets JavaScript natifs spécifiés pour exister en tant que propriétés du global objet, tandis que window.location
est une propriété de window
objet Host (un objet Host est un objet représentant un aspect de l'environnement, fourni par l'environnement, et n'est pas soumis aux mêmes règles que objets JavaScript natifs. Les autres objets Host incluent document
et tout élément DOM).
window
dans les navigateurs sert à deux fins: premièrement, agissant en tant qu'objet global ECMAScript (bien spécifié), et deuxièmement, agissant en tant qu'objet hôte fournissant des informations sur l'environnement du navigateur. Pour les utilisations de window
dans sa capacité d'objet hôte, je préfère être explicite et fournir le window.
préfixe: le fait que location
fonctionne sans c'est juste une coïncidence qui vient de la nature schizophrénique de window
. De plus, comme souligné par d'autres réponses, cela a également l'avantage de vous protéger dans le cas où une autre variable location
existe dans le contexte actuel.
Une bonne raison de ne pas préfixer Date
ou Math
avec window.
est que cela crée du code qui ne fonctionne pas dans un environnement sans navigateur. D'autres environnements ne fournissent généralement pas window
comme alias pour l'objet global.
Une partie du codage est la clarté. Contrairement à Math ou Date, l'emplacement est conceptuellement une propriété de la fenêtre, donc le code devient plus clair pour l'inclure. La fenêtre." le préfixe devrait idéalement être retiré pour la minification.
Vous avez probablement raison de dire qu'une grande partie de la raison est historique. Javascript a une longue histoire de copier-coller.
Ce n'est pas toujours une question de style - j'essayais de charger les boutons de médias sociaux de manière asynchrone après l'événement de chargement de la fenêtre en ajoutant des éléments de script à un fragment, puis en ajoutant ce fragment au document. Widgets.js de Twitter utilise location.href
À plusieurs endroits et provoquait l'erreur suivante dans IE 8/9: Appel inattendu à la méthode ou à l'accès à la propriété . Je n'ai pas compris pourquoi, mais cela ne se produit que lorsque vous visitez la page via un lien à partir d'une autre page. Si vous ajoutez simplement l'élément de script à la tête ou utilisez window.location.href
, Cela ne fonctionne pas ' t se produire, il semble donc y avoir une certaine bizarrerie avec IE 8/9 et createDocumentFragment()
.
Exemple:
<a href="http://Twitter.com/share" class="Twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
var head = document.getElementsByTagName('head')[0];
var frag = d.createDocumentFragment();
var s = d.createElement(t);
s.async = true;
s.src = 'http://platform.Twitter.com/widgets.js';
frag.appendChild(s);
head.appendChild(frag);
} (document, 'script'));
</script>
L'objet window
est l'espace de noms de travail par défaut, donc location
sera égal à window.location
.
Je pense que l'utilisation de location
est un peu ambiguë, utilisez window.location
pour plus de clarté.
C'est juste une question de style.
Conceptuellement, location
est une propriété de window
(la fenêtre est à un emplacement), contrairement à Math
ou Date
.
location est une propriété de l'objet window, vous pouvez donc l'obtenir en demandant window.location. Mais si vous ne spécifiez pas d'objet, JavaScript suppose que vous voulez l'objet fenêtre. Donc, simplement demander l'emplacement est le même que demander window.location.
Ils sont en fait identiques. Techniquement, l'objet "window
" IS la même chose que la portée racine des variables Javascript.