Подтвердить что ты не робот

Почему окно не идентично 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 объекта окна, указывающего? Он бросает что-то с равным, что еще более раздражает.

4b9b3361

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

Ответ 2

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

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

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

Для меня большой wtf:

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

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

Почему это так, так далеко от меня.