2010-09-03 29 views
29

Tengo un JavaScript que trata con la detección de si la página está en marcos o no. Utilicé top.frames [] etc. y todo funciona bien.¿Cuál es la diferencia entre uno mismo y la ventana?

En este script me di cuenta de que puedo usar "ventana" o "self" indistintamente y todo funciona igual. ¿Es "ventana" lo mismo que "auto" cuando se usa en la página HTML?

+6

Al usar Web Workers y la ventana no son lo mismo. Ver [http://stackoverflow.com/questions/11219775/global-variable-in-web-worker][1] [1]: http://stackoverflow.com/questions/11219775/global -variable-in-web-worker – user1872904

Respuesta

15

De Javascript: La guía definitiva:

El objeto Window define una serie de propiedades y métodos que permiten manipular la ventana del navegador web. También define propiedades que hacen referencia a a otros objetos importantes, como la propiedad document para el objeto de documento . Finalmente, el objeto Window tiene dos propiedades autorreferenciales , window y self. Usted puede usar cualquier variable global a referirse directamente al objeto Ventana.

En resumen, tanto window y self son las referencias al objeto de ventana, que es el objeto global de JavaScript del lado del cliente.

+0

Excepto necro-bug si FF6.0, http://stackoverflow.com/a/7769187/139361, 'window' y' self' deben ser idénticos. Alguien sabe de otros errores? --------------------------------------- Debo agregar que usando 'self' es confuso para la mayoría de los desarrolladores de javascript, así que use 'window' en su lugar. – Dan

8

Aquí está la explicación y el ejemplo de the MDN page for window.self:

if (window.parent.frames[0] != window.self) { 
    // this window is not the first frame in the list 
} 

window.self casi siempre se utiliza en las comparaciones, como en el ejemplo anterior, que descubre si la ventana actual es la primera subtrama en el conjunto de marcos principal.

Dado que nadie está utilizando conjuntos de marcos en estos días, creo que está bien considerar que no hay casos útiles para self. Además, al menos en Firefox, la prueba contra window en lugar de window.self es equivalente.

+0

Para el código que necesita ejecutarse independientemente de un navegador, parece mejor usar 'self', es decir, ejecución sin cabeza. – nilskp

+0

@nilskp, eso es interesante, pero no te entendí. ¿Podría explicar por favor? – Dan

+0

@Dan, 'window' solo está presente en una GUI (navegador). No todos los códigos Javascript se ejecutan en un navegador. En esos casos, 'self' seguirá funcionando, pero' window' no lo hará. – nilskp

6

self es una sólo lectura propiedad que puede ser más flexible que, a veces utilizado en favor de la window directamente. Esto se debe a que la referencia self cambia según el contexto operativo (a diferencia de window.self, que solo existe si existe window). También es ideal para las comparaciones, como otros han mencionado.

Por ejemplo, si usa self dentro de un Trabajador web (que vive en su propio hilo de fondo), self realmente hará referencia a WorkerGlobalScope.self. Sin embargo, si usa self en un contexto de navegador normal, self simplemente devolverá una referencia a Window.self (la que tiene document, addEventListener(), y todas las otras cosas que está acostumbrado a ver).

TL; DR mientras que el .self en window.self no existirá si no existe window, utilizando self en su propio punto de Window.self voluntad en un contexto de ventana/navegador tradicional o WorkerGlobalScope.self en un contexto trabajador web.

Como de costumbre, MDN tiene una gran descripción sobre este tema in their JavaScript docs. :)


Nota al margen: El uso de self aquí no debe ser confundido con el patrón común de JS declarar una variable local: var self = this para mantener una referencia a un contexto después de la conexión.

Puede leer más al respecto aquí: Getting Out of Binding Situations in JavaScript.

Cuestiones relacionadas