0

В чем разница между self и window?

7

Я работаю с JavaScript, который отвечает за определение, находится ли страница в фреймах или нет. Я использовал top.frames[] и всё работает корректно.

Однако, в этом скрипте я заметил, что могу использовать "window" или "self" взаимозаменяемо, и всё по-прежнему функционирует. Являются ли "window" и "self" одинаковыми при использовании на HTML-странице?

3 ответ(ов)

0

Объект Window определяет ряд свойств и методов, которые позволяют вам управлять окном веб-браузера. Он также включает свойства, ссылающиеся на другие важные объекты, такие как свойство document для объекта Document. Наконец, у объекта Window есть два самоссылающихся свойства: window и self. Вы можете использовать любую из этих глобальных переменных для прямой ссылки на объект Window.

Кратко, оба свойства window и self являются ссылками на объект Window, который является глобальным объектом для клиентского JavaScript.

0

window и self относятся к глобальному объекту текущей веб-страницы.

Для подробной информации посмотрите на http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific.

0

Что представляют ключевые слова "self" и "window" в JavaScript?

Обновление 2022 года - Я добавил это объяснение ниже с более полной информацией, касающейся HTML5 DOM и т. д. в современных браузерах.

  1. Для начала, self и window — это всего лишь ключевые слова и имена членов интерфейса Window Object. Эти ключевые слова ссылаются на один и тот же объект окна, который создается, когда вы посещаете веб-страницу в браузере. Объект Window затем создается как часть HTML DOM, который доступен через скрипты, такие как JavaScript, с помощью этих двух ключевых слов. Этот объект окна обычно доступен через более популярное ключевое слово window. Однако оба ключевых слова допускаются, как указано в определении интерфейса ниже:
interface Window {
  readonly attribute WindowProxy window;
  readonly attribute WindowProxy self;
  ...
}
  1. self и window — это просто ключевые слова JavaScript, которые указывают на один и тот же объект Window. Однако, обратите внимание, что выше они не ссылаются обратно на родительский объект, а на самом деле являются указателями на объект WindowProxy. Объект WindowProxy представляет собой оболочку вокруг объекта Window, показанного выше, и существует в одном экземпляре для каждой веб-страницы, которую вы посещаете в контексте веб-браузера. Обратите внимание, что существует только один объект WindowProxy на вкладку. Тем не менее, когда вы переходите на разные веб-страницы, новый объект Window должен быть создан внутри родительского WindowProxy. Это позволяет браузеру управлять всеми объектами Window, которые он создает, через свой прокси-объект, не теряя контекста и представления каждой отдельной вкладки. WindowProxy является как функцией безопасности, так и функцией экономии памяти, позволяя получить доступ к каждому создаваемому экземпляру окна при просмотре страниц, защищая при этом вложенный Window Object внутри. Когда объект окна создается, присвоение ключевых слов self и window его прокси позволяет обоим получать доступ к родительскому прокси вместо конкретного экземпляра объекта Window, что позволяет WindowProxy маршрутизировать любые вызовы к текущему контексту окна.

  2. Кроме безопасности и контекста ссылки на WindowProxy, этот маршрутизатор к объекту Window через оболочку был особенно важен в старые "рамочные" времена HTML, когда могло существовать множество контекстов окна, содержащих другие родительские или дочерние объекты окон в фреймах HTML4. Это особенно важно было для проблем кросс-домена 20 лет назад! Вот следующая причина для различия между self и window. Ключевое слово self (в контексте window.self) раньше имело другое важное значение и фактически использовалось для определения того, на какой фрейм вы ссылаетесь. Оно представляло собой конкретный контекст окна и ссылалось на верхний или контролирующий веб-фрейм, который содержал другие фреймы. Например, window.self могло или не могло быть тем же самым, что window.parent.frame[0]. Эти "рамочные дни" фактически ушли в прошлое из-за проблем с безопасностью доступа к окнам в фреймах, поэтому они были устаревшими после замены HTML4.2 на HTML5, который сейчас поддерживает только iframe. Однако важно понимать, что self имело предыдущее использование помимо его основного обращения к глобальной области видимости верхнего объекта окна веб-страницы, как это используется сегодня.

  3. Далее обратите внимание, что следующее верно в JavaScript при нахождении в типичном контексте окна или при просмотре веб-страницы:

self === window.self === window

Так зачем же использовать self, если есть window?

Оказывается, window, как и self, всегда указывает на объект WindowProxy, который затем снова указывает на само окно и текущий экземпляр объекта Window в вкладке браузера. Он является самореференциальным, но может указать ТОЛЬКО на себя. Но self, когда используется в других контекстах, не связанных с окном, может ссылаться на свою глобальную область или родителя, включая Web Worker API Objects, которые являются параллельными потоками, работающими рядом с Window Object, и которые имеют свою собственную неоконную область видимости. Когда вы создаете объект Web Worker в JavaScript и используете self для доступа к нему, вы ссылаетесь на верхний объект Web Worker, называемый WorkerGlobalScope. Однако self также может ссылаться на различные виды глобальной области видимости Web Worker, когда они являются другими типами, такими как DedicatedWorkerGlobalScope, ServiceWorkerGlobalScope и т. д. Все они существуют ВНЕ Window Object и имеют свою собственную глобальную область, такую как window.

Таким образом, у self теперь есть более широкая цель как псевдоним для доступа к любой Global Scope или объекту родителю!

Никто в интернете, похоже, не объясняет это... поэтому мне пришлось собрать это понятие из множества источников. Но общая тема заключается в том, что эти ключевые слова в JavaScript не всегда самореферируют на одни и те же объекты! Каждое из них было добавлено, чтобы перекрывать друг друга (и таким образом сбивать людей с толку), но затем превзошло свою первичную цель и используются для расширенных целей, которые могут возникнуть.

Так что, если вы видите self и window, понимайте, что в типичной глобальной области окон они одинаковы. Эти ключевые слова предназначены для быстрого и безопасного обращения к объекту Window через оболочку WindowProxy. Но Я рекомендую ВСЕГДА использовать window и избегать self, если вы не работаете с Web Workers.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь