> Почему this равен window, а this.name выводит другое значение в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Домклик
Стек: JavaScript
> Пример ответа
Короткий ответ
this в глобальном контексте (в браузере) ссылается на глобальный объект window. Однако this.name может выводить другое значение, потому что name - это встроенное свойство window.name (строка, часто пустая), а не произвольное свойство, которое вы могли ожидать. Если вы объявили var name = "..." на верхнем уровне, оно перезапишет window.name, но если вы использовали let или const, свойство не попадёт в window, и this.name останется прежним.
Подробное объяснение
В JavaScript значение this определяется контекстом вызова, а не местом объявления. В глобальной области видимости (вне функций) this равен глобальному объекту: в браузере это window, в Node.js - global (или globalThis).
Проблема с this.name возникает из-за особенностей глобального объекта:
-
window.name- это встроенное свойство. Оно существует всегда и изначально равно пустой строке"". Это историческое свойство, используемое для передачи данных между окнами/iframe. -
Объявление
var name = "value"на верхнем уровне создаёт свойство наwindow, перезаписываяwindow.name. Тогдаthis.nameвернёт ваше значение. -
Объявление
let name = "value"илиconst name = "value"не создаёт свойства наwindow(они живут в отдельной лексической области). Поэтомуthis.nameпродолжит возвращать встроенноеwindow.name(пустую строку или значение, установленное ранее). -
Если вы пишете
this.name = "value"- вы явно устанавливаете свойство наwindow, и оно перезапишет встроенное.
Также важно: в строгом режиме ("use strict") в глобальной функции this будет undefined, а не window, но в глобальной области видимости вне функций this всё равно остаётся globalThis.
На практике
На практике это проявляется, когда разработчик ожидает, что this в глобальном контексте даст доступ к объявленным переменным. Однако:
var-переменные попадают вwindow,let/const- нет.window.name- зарезервированное свойство, его перезапись может сломать логику, связанную с фреймами.- В модулях (ES modules) глобальный
this-undefined, потому что модули всегда в strict mode.
Для доступа к глобальным переменным лучше использовать globalThis или явные ссылки на window, а не полагаться на this.
Пример кода
JAVASCRIPT// В браузере, глобальная областьconsole.log(this === window); // trueconsole.log(this.name); // "" - встроенное свойствоvar name = "Alice";console.log(this.name); // "Alice" - перезаписали window.namelet surname = "Smith";console.log(this.surname); // undefined - let не создаёт свойство на windowthis.age = 30;console.log(window.age); // 30 - явно установили
Как отвечать на собеседовании
Начните с чёткого определения: this - это контекст вызова, в глобальной области он равен window. Затем объясните, что name - это специальное свойство window, и разницу между var, let, const в глобальной области. Упомяните strict mode и globalThis как современную альтернативу. Покажите пример, демонстрирующий поведение. Если спросят про Node.js - скажите, что там this в глобальной области равен global, но global.name не существует по умолчанию.
Что проверяет интервьюер
Интервьюер проверяет:
- понимание контекста выполнения и правил определения
this; - знание различий между
var,let,constв глобальной области; - осведомлённость о встроенных свойствах глобального объекта;
- понимание strict mode и его влияния на
this; - умение объяснить неочевидное поведение языка.
Типичные ошибки
- Утверждение, что
thisвсегда равенwindow- это верно только для глобального контекста и обычных функций (не стрелочных). - Игнорирование того, что
window.name- встроенное свойство, и объяснение только через объявление переменных. - Забывают про
let/const, которые не создают свойств наwindow. - Путают
thisв глобальной области иthisвнутри функций (в нестрогом режиме в обычной функцииthisтожеwindow, но это другой механизм). - Не упоминают
globalThisкак универсальный способ доступа к глобальному объекту.
> Похожие задачи по frontend
Как работает приведение типов в выражениях с операторами сравнения в JavaScript
Как предотвратить двойной заказ при двойном клике на кнопку?
Как вызвать функцию, чтобы this указывал на нужный объект, а не на window в JavaScript
На какой стадии отрабатывают внешние нецелевые обработчики событий в DOM
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью