window.location versus solo ubicación


79

En toda la web, veo una gran cantidad de programadores de JavaScript escribiendo en window.locationlugar de solo location. Tenía curiosidad por saber si alguien podía ofrecer una explicación de por qué. windowes el objeto global y, por lo tanto, no es necesario incluirlo, ¿no es así? Quiero decir, no ves a la gente escribir window.Math.flooro new window.Date(), así que tengo curiosidad por saber por qué se especificaría con location.

Entiendo que locationse considera que es una "propiedad" de la ventana en la que estás, lo cual supongo que tiene algún sentido. Pero aun así, no veo ninguna razón para especificar el objeto global; no es posible sobrescribir locationen primer lugar, no sin redirigir la página.

Entonces, ¿es esto solo una peculiaridad que se ha utilizado durante tanto tiempo que se ha integrado con la forma en que escribimos JavaScript, o hay alguna razón tangible para hacer las cosas de esta manera? Revisé Google, pero, por desgracia, no encontré nada ...

Respuestas:


85

Siempre lo uso window.locationen mi código por dos razones principales:

  1. Es un buen hábito evitar las variables globales siempre que sea posible. Usar el window.prefijo me recuerda que la variable es global y otras no.
  2. La naturaleza del alcance de Javascript le permite anular las variables configuradas más arriba en el árbol de alcance. Esto significa que podría haber establecido var locationalgún lugar en un alcance contenedor (no es una palabra improbable para usar como nombre de variable) y estaría trabajando en eso en su lugar.

Para mí, la claridad de propósito al codificar es muy importante, ya que me ayuda a evitar errores de escritura y luego me ayuda a encontrarlos cuando lo hago.


También imagino que decirle a JS dónde encontrar la variable en lugar de hacer que recorra la cadena de alcance hasta el alcance global puede ser un enfoque más rápido.
Rayjax

3
@Rayjax No, en realidad, porque JS también tiene que recorrer la cadena de alcance para determinar qué window es.
solitario

16

En parte por seguridad en caso de que alguien defina una locationvariable en algún lugar de la cadena de alcance. la window.locationhace una referencia explícita a la propiedad dewindow .

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

})();

11

Hay una gran diferencia entre window.locationlos objetos nativos Mathy Date, que es que Mathy Dateson objetos JavaScript nativos que se especifican para existir como propiedades del objeto global, mientras que window.locationes una propiedad del window objeto host (un objeto host es un objeto que representa algún aspecto de el entorno, proporcionado por el entorno, y no está sujeto a las mismas reglas que los objetos JavaScript nativos. Otros objetos host incluyendocument y cualquier elemento DOM).

windowen los navegadores tiene dos propósitos: primero, actuar como el objeto global ECMAScript (bien especificado), y segundo, actuar como un objeto anfitrión que proporciona información sobre el entorno del navegador. Para los usos de windowen su capacidad de objeto anfitrión, prefiero ser explícito y proporcionar el window.prefijo: el hecho de que locationfuncione sin él es solo una coincidencia que proviene de windowla naturaleza esquizofrénica. Además, como se señaló en otras respuestas, esto también tiene la ventaja de protegerlo en el caso de que locationexista otra variable en el contexto actual.

Una buena razón para no usar el prefijo Dateo Mathcon window.es que al hacerlo se crea un código que no funciona en un entorno sin navegador. Otros entornos generalmente no proporcionan windowun alias para el objeto global.


6

Parte de la codificación es la claridad. A diferencia de Math o Date, la ubicación es conceptualmente una propiedad de la ventana, por lo que el código se vuelve más claro para incluirla. La ventana." Lo ideal es eliminar el prefijo para la minificación.

Probablemente tenga razón en que gran parte de la razón es histórica. Javascript tiene un extenso historial de copiar y pegar.


Eso es lo que pensé, pero hay mucha gente que lo hace; prácticamente todas las fuentes que veo utilizan window.location. Las únicas páginas "versus" que pude encontrar discuten window.locationversus location.href, que tampoco ayudaron.
Reid

5

No siempre es solo una cuestión de estilo: estaba tratando de cargar botones de redes sociales de forma asincrónica después del evento de carga de la ventana agregando elementos de script a un fragmento y luego agregando ese fragmento al documento. El widgets.js de Twitter se usa location.hrefen varios lugares y estaba causando el siguiente error en IE 8/9: Llamada inesperada al método o acceso a la propiedad . No he descubierto por qué, pero esto solo sucede cuando se visita la página a través de un enlace de otra página. Si solo agrega el elemento de script al encabezado o lo usa window.location.href, esto no ocurre, por lo que parece ser una rareza con IE 8/9 ycreateDocumentFragment() .

Ejemplo:

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

3

El windowobjeto es el espacio de nombres de trabajo predeterminado, por locationlo que será igual awindow.location .

Creo que el uso locationes un poco ambiguo, utilícelo window.locationpara mayor claridad.


1
Voté por esta respuesta (y casi ninguna de las otras) porque, imagina este ejemplo tonto: function f() { var location = "home"; /* later on */ location = "http://google.com" } llorar

@ user166390 Por esa lógica, debe escribir window.documentcada vez. Dudo que alguien esté haciendo eso.
superlukas

2

Es solo una cuestión de estilo.

Conceptualmente, locationes una propiedad de window(la ventana está en una ubicación), a diferencia de Matho Date.


1

location es una propiedad del objeto window, por lo que puede obtenerlo solicitando window.location. Pero si no especifica un objeto, JavaScript asume que desea el objeto de ventana. Entonces, solo solicitar la ubicación es lo mismo que solicitar la ubicación de la ventana.


0

En realidad, son idénticos. Técnicamente, el "window " objeto ES lo mismo que el alcance raíz de las variables de Javascript.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.