> Почему 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 возникает из-за особенностей глобального объекта:

  1. window.name - это встроенное свойство. Оно существует всегда и изначально равно пустой строке "". Это историческое свойство, используемое для передачи данных между окнами/iframe.

  2. Объявление var name = "value" на верхнем уровне создаёт свойство на window, перезаписывая window.name. Тогда this.name вернёт ваше значение.

  3. Объявление let name = "value" или const name = "value" не создаёт свойства на window (они живут в отдельной лексической области). Поэтому this.name продолжит возвращать встроенное window.name (пустую строку или значение, установленное ранее).

  4. Если вы пишете 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); // true
console.log(this.name); // "" - встроенное свойство
var name = "Alice";
console.log(this.name); // "Alice" - перезаписали window.name
let surname = "Smith";
console.log(this.surname); // undefined - let не создаёт свойство на window
this.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 как универсальный способ доступа к глобальному объекту.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью