2012-01-27 8 views
8

Cada propiedad del objeto window es una variable global. Esto significa que puede hacer algo como esto:¿Cuál es el propósito de hacer referencia al objeto ventana en Javascript?

window.foo = 42; 
alert(foo); //alerts 42 
var bar = 3; 
alert(window["bar"]); //alerts 3 

Debido a esto, siempre me he preguntado cuál es el propósito era incluir window en código como este

if(window.prompt("Enter Password") === "secret") { 
    window.location.hash = "authorized"; 
    window.open("secretPage.html"); 
} 

cuando se podría omitir window y tienen código que hace exactamente lo mismo:

if(prompt("Enter Password") === "secret") { 
    location.hash = "authorized"; 
    open("secretPage.html"); 
} 

El uso también parece inconsistente; Casi nunca veo window.alert pero con frecuencia veré window.location.

¿A la gente le gusta hacer referencia a window para hacer que su código sea más detallado? ¿Hay alguna buena razón para hacer esto que yo no sepa?

+0

'window' es solo una propiedad del objeto global. – Saxoier

+0

... que apunta a sí mismo. – Saxoier

+1

Lo que es interesante, porque eso significa 'ventana === window.window.window.window.window.window' –

Respuesta

5

Una situación en la que ayuda a ser explícito es que quedará inmediatamente claro dentro de una función que tiene la intención de modificar una variable global. Por ejemplo:

function blah() { 
    // a bunch of code preceding... 
    test = "aha!"; 
} 

¿Alguien olvide declarar test con var? ¿O es esta modificación intencional de un global? Comparar:

function blah() { 
    // a bunch of code preceding... 
    window.test = "aha!"; 
} 

Ahora queda claro lo que se pretende. Por supuesto, ya sabes, los globales deberían evitarse en primer lugar, pero entiendes mi punto.

1

ventana es implícita, pero es una buena práctica de código para evitar la ambigüedad cuando sea posible.

+1

Sería bueno evitar la ambigüedad, pero no estoy seguro de ver cómo podría ser ambiguo. –

+0

supongamos que escribió una función "abrir" que hizo algo más que abrir una nueva ventana? O tal vez un archivo js extraterrestre que importó contaminó su espacio de nombre global ... entonces será mejor que utilice referencias totalmente calificadas. –

+1

Si creó una variable global 'var open = 3;' e intentó hacer 'window.open()', se produciría un error porque 'window.open' se sobrescribió. Los archivos alienígenas js que contaminan el espacio de nombre global cambiarán el comportamiento esperado independientemente de si usas 'open' o' window.open'. –

2

Creo que generalmente se usa para evitar choques potenciales con otras variables en un cierre envolvente. Además, los comprobadores de estilo como jslint generarán errores si accede a propiedades globales sin un objeto explícito (excepto para propiedades bien conocidas como window).

Dicho esto, en un navegador, cuando ingresa a varias ventanas, por ejemplo, con iframes, etc., es posible que deba pasar explícitamente una referencia al objeto ventana. (Y si realmente le importan los detalles, el objeto ventana, o al menos las referencias a él, son muy especiales y ni siquiera se pueden describir en javascript estándar)

Cuestiones relacionadas