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