Почему окно не идентично window.self в Internet Explorer? - PullRequest
25 голосов
/ 28 апреля 2010

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

В Safari, Firefox и его друзьях результаты такие же, как и яожидайте:

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

В Internet Explorer это не так, однако:

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

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

Ответы [ 2 ]

16 голосов
/ 28 апреля 2010

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

4 голосов
/ 28 апреля 2010

Хороший вопрос. Он делает это с document и document.parentWindow тоже:

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

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

Для меня большое значение:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...