Почему окно не идентично window.self в Internet Explorer?

Существует замысловатое вовлечение предыстории, как я столкнулся с этим, но почему self свойство, не точно равное самому окну?

В Safari и Firefox и друзьях, результаты состоят в том, как я ожидал бы:

> window == window.self
  true
> window === window.self
  true

То же не верно в Internet Explorer, хотя:

>> window == window.self
   true
>> window === window.self
   false

Кто-либо может объяснить несоответствие? К точно, что self свойство указания объекта окна? Это бросает к чему-то с равенством, которое является еще более раздражающим.

26
задан Gordon Gustafson 27 April 2010 в 21:17
поделиться

2 ответа

Это еще не все, 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, поэтому они могут возвращать что-то другое (и должны, ради кроссфреймового скриптинга).

16
ответ дан 28 November 2019 в 17:22
поделиться

Хороший вопрос. Он делает это с помощью документа и document.parentWindow тоже:

window == document; // true
window === document; // false

window == document.parentWindow; // true
window === document.parentWindow; // false

Для меня большая неприятность:

window == document; // true
document == window; // false

Вы можете заменить окно с помощью this в любом из приведенных выше примеров (и оставаясь в глобальном контексте) с теми же результатами. Это делает оператор == еще более подозрительным.

Почему он так себя ведет, мне непонятно.

4
ответ дан 28 November 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: