En toda la web, veo una gran cantidad de programadores de JavaScript escribiendo en window.location
lugar de solo location
. Tenía curiosidad por saber 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 a la gente escribir window.Math.floor
o new window.Date()
, así que tengo curiosidad por saber por qué se especificaría con location
.
Entiendo que location
se 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 location
en 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 ...
window
es.En parte por seguridad en caso de que alguien defina una
location
variable en algún lugar de la cadena de alcance. lawindow.location
hace 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 })(); })();
fuente
Hay una gran diferencia entre
window.location
los objetos nativosMath
yDate
, que es queMath
yDate
son objetos JavaScript nativos que se especifican para existir como propiedades del objeto global, mientras quewindow.location
es una propiedad delwindow
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).window
en 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 dewindow
en su capacidad de objeto anfitrión, prefiero ser explícito y proporcionar elwindow.
prefijo: el hecho de quelocation
funcione sin él es solo una coincidencia que proviene dewindow
la naturaleza esquizofrénica. Además, como se señaló en otras respuestas, esto también tiene la ventaja de protegerlo en el caso de quelocation
exista otra variable en el contexto actual.Una buena razón para no usar el prefijo
Date
oMath
conwindow.
es que al hacerlo se crea un código que no funciona en un entorno sin navegador. Otros entornos generalmente no proporcionanwindow
un alias para el objeto global.fuente
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.
fuente
window.location
. Las únicas páginas "versus" que pude encontrar discutenwindow.location
versuslocation.href
, que tampoco ayudaron.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.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 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 usawindow.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>
fuente
El
window
objeto es el espacio de nombres de trabajo predeterminado, porlocation
lo que será igual awindow.location
.Creo que el uso
location
es un poco ambiguo, utilícelowindow.location
para mayor claridad.fuente
function f() { var location = "home"; /* later on */ location = "http://google.com" }
llorarwindow.document
cada vez. Dudo que alguien esté haciendo eso.Es solo una cuestión de estilo.
Conceptualmente,
location
es una propiedad dewindow
(la ventana está en una ubicación), a diferencia deMath
oDate
.fuente
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.
fuente
En realidad, son idénticos. Técnicamente, el "
window
" objeto ES lo mismo que el alcance raíz de las variables de Javascript.fuente