javascript location window.location

javascript - window.location versus solo ubicación



(9)

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

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

En toda la web, veo un gran número de programadores de JavaScript que escriben window.location lugar de solo la location . Tenía curiosidad si alguien podía 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, no ves personas que escriben window.Math.floor o new window.Date() , así que tengo curiosidad por saber por qué se especificará con la location .

Entiendo que la location se considera una "propiedad" de la ventana en la que se encuentra, lo cual supongo que tiene algún sentido. Pero aún así, no veo ninguna razón para especificar el objeto global; no es posible sobrescribir la 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 por desgracia, se me ocurrió nada ...


En parte por seguridad, en caso de que alguien defina una variable de location en algún lugar de la cadena de alcance. the window.location convierte en 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 })(); })();


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


Es solo una cuestión de estilo.

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


Hay una gran diferencia entre window.location y los objetos nativos Math y Date , que es que Math y Date son objetos nativos de JavaScript que se especifican como propiedades del objeto global, mientras que window.location es una propiedad del objeto host de la window (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 JavaScript nativos. Otros objetos host incluyen document y cualquier elemento DOM).

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

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


No siempre es solo una cuestión de estilo: estaba intentando cargar botones de redes sociales de forma asíncrona 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 causó el siguiente error en IE 8/9: Llamada inesperada al acceso a métodos o propiedades . No he descubierto 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 de script a la cabecera o usa window.location.href , esto no ocurre, por lo que parece ser algo extraño con IE 8/9 y createDocumentFragment() .

Ejemplo:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www..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>


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 debería ser eliminado idealmente para minificación.

Probablemente tienes razón en que muchas de las razones son históricas. Javascript tiene una extensa historia de copiar y pegar.


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

  1. Es un buen hábito evitar variables globales siempre que sea posible. Usando la window. prefijo me recuerda que la variable es global y que otras no lo son.
  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 la var location algún lugar de un ámbito de contención (no es una palabra improbable que se use como nombre de variable) y estaría trabajando en eso en su lugar.

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.


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. Así que solo solicitar la ubicación es lo mismo que solicitar la ubicación de ventana.