Существует замысловатое вовлечение предыстории, как я столкнулся с этим, но почему self
свойство, не точно равное самому окну?
В Safari и Firefox и друзьях, результаты состоят в том, как я ожидал бы:
> window == window.self
true
> window === window.self
true
То же не верно в Internet Explorer, хотя:
>> window == window.self
true
>> window === window.self
false
Кто-либо может объяснить несоответствие? К точно, что self
свойство указания объекта окна? Это бросает к чему-то с равенством, которое является еще более раздражающим.
Это еще не все, window!==window.window
!
Я полагаю, что здесь мы, вероятно, видим разницу между объектами 'inner window' и 'outer window'. Конечно, они есть и в других браузерах (например, Moz); обычно они используются для представления разного вида window
изнутри и снаружи его собственного кода.
Во внутреннем окне хранятся ваши глобальные переменные и члены, специфичные для документа. Внешнее окно доступно для [кросс-фреймовых] сценариев через такие ссылки на окно, как frames[n]
, parent
, opener
, и, по-видимому, self
. Он привязан к области просмотра владельца (окно/фрейм браузера), поэтому, например, когда вы переходите через iframe к новому документу, родительский документ все еще видит объект с идентичностью window
в своем iframe.
В разумном дизайне Browser Object Model для этого были бы отдельные объекты, но когда JavaScript был первоначально создан Netscape, было очень мало внимания уделено элегантности, что привело к этому и многим другим интерфейсам, где слишком много перегрузки (form
с элементом под названием submit
, кто-нибудь?).
Поэтому для совместимости разделенное окно должно продолжать казаться единым объектом для скриптов, даже если под ним ничего нет. В IE иногда маска сползает: кажется, что если сказать window
, вы получите внутреннее окно, и нет никакого хака, чтобы сделать его ===
против внешнего окна.
ETA: Вообще-то, если подумать, для этого даже есть некоторое (слабое) обоснование. Спецификация ECMAScript, которая не была написана с учетом множества глобальных контекстов, определяет window
и несвязанную версию this
как получение объекта области видимости глобальной переменной, которая будет внутренним окном.
Другие свойства, будучи частью DOM/BOM, не входят в сферу действия спецификации ECMA, поэтому они могут возвращать что-то другое (и должны, ради кроссфреймового скриптинга).
Хороший вопрос. Он делает это с помощью документа
и document.parentWindow
тоже:
window == document; // true
window === document; // false
window == document.parentWindow; // true
window === document.parentWindow; // false
Для меня большая неприятность:
window == document; // true
document == window; // false
Вы можете заменить окно
с помощью this
в любом из приведенных выше примеров (и оставаясь в глобальном контексте) с теми же результатами. Это делает оператор ==
еще более подозрительным.
Почему он так себя ведет, мне непонятно.