2011-01-17 12 views
56

En la web, veo una gran cantidad de programadores de JavaScript que escriben window.location en lugar de solo location. Tenía curiosidad si alguien pudiera ofrecer una explicación de por qué. window es el objeto global y, por lo tanto, no es necesario incluirlo, ¿no es así? Quiero decir, usted no ve personas escribiendo window.Math.floor o new window.Date(), entonces tengo curiosidad de por qué se especificará con location.window.location versus solo ubicación

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

Entonces, ¿esto es 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 desafortunadamente, no encontré nada ...

Respuesta

57

siempre uso window.location en mi código por dos razones principales:

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

Para mí, la claridad de propósito cuando se codifica es muy importante ya que me ayuda a evitar la creación de errores y luego me ayuda a encontrarlos cuando lo hago.

+0

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

+1

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

1

Es solo una cuestión de estilo.

Conceptualmente, location es una propiedad de la window (la ventana está en una ubicación), a diferencia de Math o Date.

0

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

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." el prefijo idealmente debería eliminarse para la minificación.

Probablemente tenga razón en que muchos de los motivos son históricos. Javascript tiene una extensa historia de copiar y pegar.

+0

Eso es lo que pensé, pero hay muchas personas que lo hacen; casi todas las fuentes que veo usan 'window.location'. Las únicas páginas "en contra" que pude encontrar discuten 'window.location' vs' location.href', lo que tampoco ayudó. – Reid

1

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

3

El objeto window es el espacio de nombre de trabajo predeterminado, por lo que location será igual a window.location.

Creo que usar location es un poco ambiguo, use window.location para mayor claridad.

+1

He votado a favor de esta respuesta (y casi ninguna de las otras) porque, imagine este ejemplo tonto: 'función f() {var location =" home ";/* más adelante */location = "http://google.com"} '* cry * –

+0

@ user166390 Con esta lógica, debe escribir' window.document' cada vez. Dudo que alguien esté haciendo eso. – superlukas

13

En parte por seguridad en caso de que alguien defina una variable location en algún lugar de la cadena de alcance. el window.location lo hace una referencia explícita a la propiedad de window.

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

})(); 
6

Hay una gran diferencia entre window.location y el nativo Math y Date objetos, y es que Math y Date son objetos nativos de JavaScript que se especifican a existir como propiedades del objeto global, mientras que window.location es una propiedad de la windowanfitrión objeto (un objeto host es un objeto que representa algún aspecto del entorno, proporcionado por el entorno y no está sujeto a las mismas reglas que los objetos nativos de JavaScript. Otros objetos host incluyen document y cualquier elemento DOM).

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

Una buena razón para no anteponer Date o Math con window. es que hacerlo crea código que no funciona en un entorno que no sea del navegador. Otros entornos generalmente no proporcionan window como un alias para el objeto global.

4

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

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