Это еще не все, window!==window.window
!
Я полагаю, что мы, вероятно, видим здесь разницу между объектами «внутреннего окна» и «внешнего окна». Конечно, другие браузеры имеют такие (например, Moz ); они обычно используются для представления другого взгляда на window
изнутри и вне его собственного кода.
Внутреннее окно содержит ваши глобальные переменные и специфичные для документа члены. Внешнее окно доступно для сценариев [cross-frame-] через ссылки на окна, такие как frames[n]
, parent
, opener
и, очевидно, self
. Он привязан к окну просмотра владельца (окно / рамка браузера), например, при перемещении iframe к новому документу родительский документ все еще видит объект тот же идентификатор window
в своем iframe.
В разумном дизайне объектной модели браузера были бы отдельные объекты для этого, но когда Netscape изначально создавал JavaScript, было очень мало внимания к элегантности, в результате чего этот и многие другие интерфейсы были перегружены (form
с элементом под названием submit
, кто-нибудь?).
Таким образом, для совместимости, разделенное окно должно продолжаться до , кажутся единым объектом для сценариев, даже если оно не находится под ним. В IE иногда маска проскальзывает: похоже, что window
возвращает вам внутреннее окно, и нет никакого хака, чтобы сделать его ===
против внешнего окна.
ETA: На самом деле, если подумать, есть даже (плохое) оправдание этому. Спецификация ECMAScript, которая не написана с учетом нескольких глобальных контекстов, определяет window
и несвязанную версию this
как извлечение объекта области глобальной переменной, который будет внутренним окном.
Другие свойства, являющиеся частью DOM / BOM, не входят в сферу применения спецификации ECMA, поэтому они могут возвращать что-то другое (и должны, для межкадрового скриптинга).