Какой глобальный объект используется в браузере как глобальный контекст?
Что проверяют
Знаете ли вы, что кроме window есть globalThis, и чем глобальная область видимости отличается от глобального объекта. Короткий ответ «window» засчитают, но сразу спросят, что попадёт в window при let и var и что будет в модуле или воркере.
Как отвечать
В основном потоке страницы глобальный объект это window. Формально код видит WindowProxy, обёртку, которая при навигации переключается на новый Window, но в ответе достаточно знать, что она есть. Через window доступны document, location, history, localStorage, таймеры.
Дальше покажите нюансы:
globalThis: стандартное имя глобального объекта с ES2020, одинаково работает в браузере, воркерах и Node.js. В воркереwindowнет, тамself, в Node.js историческиglobal;varиfunction: на верхнем уровне классического скрипта становятся свойствамиwindow;let,const,class: живут в глобальной области, но свойствамиwindowне становятся, послеlet a = 1выражениеwindow.aвернётundefined;- модули: в
<script type="module">верхнеуровневые объявления видны только внутри модуля, вwindowничего не попадает, аthisна верхнем уровне равенundefined; thisв функции: в нестрогом режиме при обычном вызове этоwindow, в строгом режиме и в модуляхundefined.
Хорошо добавить, почему глобальный объект считают проблемой: это общее пространство имён, где скрипты разных авторов перетирают друг другу переменные. Отсюда модули и сборщики.
Где спотыкаются
Говорят, что любая глобально объявленная функция вызывается с this === window. Это верно только для нестрогого кода, а в модулях и классах строгий режим включён всегда.
Считают, что let на верхнем уровне тоже создаёт window.x, и строят на этом логику.
Не знают про встроенные свойства window. Классический пример: var name = 42 в обычном скрипте, после чего typeof name вернёт "string", потому что name это уже существующее свойство окна, которое приводит значение к строке. Похожая ловушка: элементы с id доступны как глобальные переменные.