В чем разница между self и window?
Я работаю с JavaScript, который отвечает за определение, находится ли страница в фреймах или нет. Я использовал top.frames[] и всё работает корректно.
Однако, в этом скрипте я заметил, что могу использовать "window" или "self" взаимозаменяемо, и всё по-прежнему функционирует. Являются ли "window" и "self" одинаковыми при использовании на HTML-странице?
3 ответ(ов)
Объект Window определяет ряд свойств и методов, которые позволяют вам управлять окном веб-браузера. Он также включает свойства, ссылающиеся на другие важные объекты, такие как свойство document
для объекта Document. Наконец, у объекта Window есть два самоссылающихся свойства: window
и self
. Вы можете использовать любую из этих глобальных переменных для прямой ссылки на объект Window.
Кратко, оба свойства window
и self
являются ссылками на объект Window, который является глобальным объектом для клиентского JavaScript.
window
и self
относятся к глобальному объекту текущей веб-страницы.
Для подробной информации посмотрите на http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific.
Что представляют ключевые слова "self" и "window" в JavaScript?
Обновление 2022 года - Я добавил это объяснение ниже с более полной информацией, касающейся HTML5 DOM и т. д. в современных браузерах.
- Для начала,
self
иwindow
— это всего лишь ключевые слова и имена членов интерфейса Window Object. Эти ключевые слова ссылаются на один и тот же объект окна, который создается, когда вы посещаете веб-страницу в браузере. Объект Window затем создается как часть HTML DOM, который доступен через скрипты, такие как JavaScript, с помощью этих двух ключевых слов. Этот объект окна обычно доступен через более популярное ключевое словоwindow
. Однако оба ключевых слова допускаются, как указано в определении интерфейса ниже:
interface Window {
readonly attribute WindowProxy window;
readonly attribute WindowProxy self;
...
}
self
иwindow
— это просто ключевые слова JavaScript, которые указывают на один и тот же объект Window. Однако, обратите внимание, что выше они не ссылаются обратно на родительский объект, а на самом деле являются указателями на объект WindowProxy. Объект WindowProxy представляет собой оболочку вокруг объекта Window, показанного выше, и существует в одном экземпляре для каждой веб-страницы, которую вы посещаете в контексте веб-браузера. Обратите внимание, что существует только один объект WindowProxy на вкладку. Тем не менее, когда вы переходите на разные веб-страницы, новый объект Window должен быть создан внутри родительского WindowProxy. Это позволяет браузеру управлять всеми объектами Window, которые он создает, через свой прокси-объект, не теряя контекста и представления каждой отдельной вкладки. WindowProxy является как функцией безопасности, так и функцией экономии памяти, позволяя получить доступ к каждому создаваемому экземпляру окна при просмотре страниц, защищая при этом вложенный Window Object внутри. Когда объект окна создается, присвоение ключевых словself
иwindow
его прокси позволяет обоим получать доступ к родительскому прокси вместо конкретного экземпляра объекта Window, что позволяет WindowProxy маршрутизировать любые вызовы к текущему контексту окна.Кроме безопасности и контекста ссылки на WindowProxy, этот маршрутизатор к объекту Window через оболочку был особенно важен в старые "рамочные" времена HTML, когда могло существовать множество контекстов окна, содержащих другие родительские или дочерние объекты окон в фреймах HTML4. Это особенно важно было для проблем кросс-домена 20 лет назад! Вот следующая причина для различия между
self
иwindow
. Ключевое словоself
(в контекстеwindow.self
) раньше имело другое важное значение и фактически использовалось для определения того, на какой фрейм вы ссылаетесь. Оно представляло собой конкретный контекст окна и ссылалось на верхний или контролирующий веб-фрейм, который содержал другие фреймы. Например,window.self
могло или не могло быть тем же самым, чтоwindow.parent.frame[0]
. Эти "рамочные дни" фактически ушли в прошлое из-за проблем с безопасностью доступа к окнам в фреймах, поэтому они были устаревшими после замены HTML4.2 на HTML5, который сейчас поддерживает толькоiframe
. Однако важно понимать, чтоself
имело предыдущее использование помимо его основного обращения к глобальной области видимости верхнего объекта окна веб-страницы, как это используется сегодня.Далее обратите внимание, что следующее верно в 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.
Как определить, что окно браузера в данный момент не активно?
Как перенаправить на другую веб-страницу?
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub