В чем разница между 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 - Получение Высоты Окна Браузера
Где найти документацию по форматированию даты в JavaScript?
Как проверить, содержит ли массив строку в TypeScript?
Ссылка и выполнение внешнего JavaScript-файла, размещенного на GitHub