Eso no es todo, window!==window.window
!
Creo que lo que probablemente estamos viendo aquí es la diferencia entre los objetos 'ventana interior' y 'ventana exterior'. Ciertamente, otros navegadores tienen estos (por ejemplo, Moz); normalmente se utilizan para presentar una vista diferente del window
desde dentro y fuera de su propio código.
La ventana interna contiene sus variables globales y miembros específicos del documento. La ventana externa es accesible para [cross-frame-] scripting a través de referencias de ventana como frames[n]
, parent
, opener
, y aparentemente self
. Está vinculado a la ventana gráfica del propietario (ventana/marco del navegador), por lo que, por ejemplo. cuando navega un iframe a un documento nuevo, el documento padre aún ve el objeto identidad igual a window
en su iframe.
En un diseño de Modelo de objetos del navegador sensible habría objetos separados para esto, pero cuando JavaScript fue originalmente creado por Netscape se tuvo muy poca consideración por elegancia, lo que resultó en esta y muchas otras interfaces donde hay demasiada sobrecarga (form
con un elemento llamado submit
, ¿alguien?).
Por lo tanto, para compatibilidad, la ventana dividida tiene que continuar a aparecer para ser un objeto único para los scripts aunque no se encuentre debajo. En IE, a veces la máscara se desliza: parece que decir window
te da la ventana interior, y no hay truco para que sea ===
contra la ventana exterior.
ETA: En realidad, ahora que lo pienso, incluso hay una justificación (deficiente) para esto. La especificación ECMAScript, que no está escrita con múltiples contextos globales en mente, define window
, y la versión no vinculada de this
, como la recuperación del objeto de ámbito de variable global, que sería la ventana interna.
Las demás propiedades, que forman parte del DOM/BOM, no están dentro del alcance de la especificación ECMA, por lo que pueden devolver algo diferente (y deben, en aras de la creación de scripts de trama cruzada).
Interesante aparentemente no son del mismo tipo. window.self.self === window.self es igual al pensamiento verdadero. Aparentemente IE trata a la ventana como un tipo especial. –
porque IE hace todo mal. :-) –