web-dev-qa-db-fra.com

window.location versus just location

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é ...

73
Reid

J'utilise toujours window.location dans mon code pour deux raisons principales:

  1. C'est une bonne habitude d'éviter autant que possible les variables globales. En utilisant le window. le préfixe me rappelle que la variable est globale et que les autres ne le sont pas.
  2. La nature de la portée de Javascript vous permet de remplacer les variables définies plus haut dans l'arborescence. Cela signifie que vous auriez pu définir 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.

70
lonesomeday

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
    })();

})();
14
user113716

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 windowobjet 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.

9
Tim Down

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.

6
fuzzyTew

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>
5
rhurkes

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é.

3
Jacob Relkin

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.

2
SLaks

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.

1
arlomedia

Ils sont en fait identiques. Techniquement, l'objet "window" IS la même chose que la portée racine des variables Javascript.

0
Adam Batkin