> Куда указывает this в обычном JavaScript скрипте (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: YADRO
Стек: JavaScript
> Пример ответа
Короткий ответ
В обычном JavaScript скрипте (не в strict mode) значение this зависит от контекста вызова. В глобальном контексте (на уровне модуля или скрипта) this указывает на глобальный объект: window в браузере, global в Node.js. Внутри обычной функции (не стрелочной) this определяется тем, как функция вызвана - если без явного контекста, это снова глобальный объект.
Подробное объяснение
this в JavaScript - это динамическая ссылка, которая вычисляется в момент вызова функции, а не в момент её объявления. В обычном скрипте (без "use strict") поведение this определяется следующими правилами:
- Глобальный контекст: на верхнем уровне скрипта
thisравен глобальному объекту (windowв браузере,globalв Node.js). - Обычная функция: если функция вызвана без явного привязывания (через точку,
call,apply,bind),thisуказывает на глобальный объект. Это одна из главных причин багов - случайное загрязнение глобальной области. - Метод объекта: когда функция вызывается как свойство объекта (через точку),
thisссылается на этот объект. - Конструктор: при вызове с
newthisуказывает на новый создаваемый экземпляр. - Обработчики событий: в DOM-событиях
thisобычно равен элементу, на котором висит обработчик (если не используется стрелочная функция).
В strict mode ("use strict") поведение меняется: в обычной функции без контекста this будет undefined, что предотвращает случайные глобальные присваивания.
На практике
Для senior-разработчика важно понимать, что this - это не про лексическую область видимости, а про контекст вызова. На практике это означает:
- Использовать стрелочные функции для сохранения лексического
this(например, в колбэках или методах класса). - Явно привязывать контекст через
.bind(),.call()или.apply()при передаче методов как колбэков. - В классах (ES6) методы по умолчанию не привязаны к экземпляру - нужно либо bind в конструкторе, либо стрелочные методы (экспериментальный синтаксис).
- Избегать полагания на
thisв глобальном контексте - это делает код хрупким и трудно тестируемым.
Пример кода
JAVASCRIPT// Глобальный контекстconsole.log(this === window); // true (в браузере)function showThis() {console.log(this); // window (не strict mode)}const obj = {name: 'test',method: function() {console.log(this.name); // 'test'}};obj.method();const extracted = obj.method;extracted(); // undefined или window.name (потеря контекста)// Исправление через bindconst bound = obj.method.bind(obj);bound(); // 'test'
Как отвечать на собеседовании
Начни с чёткого определения: this определяется контекстом вызова, а не объявления. Приведи основные правила (глобальный объект, метод, конструктор, стрелочные функции). Обязательно упомяни разницу между strict и non-strict mode. Покажи понимание практических проблем: потеря контекста при передаче методов, использование .bind() и стрелочных функций. Для senior-уровня добавь про this в классах и в обработчиках событий.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание динамической природы
thisи отличие от лексического скоупа. - Знание четырёх правил привязки (default, implicit, explicit, new).
- Осознание различий между обычными и стрелочными функциями.
- Практический опыт с багами, связанными с потерей контекста.
- Умение объяснить сложную тему простыми словами с примерами.
Типичные ошибки
- Утверждение, что
thisвсегда указывает на объект, в котором определена функция (путаница с лексическим скоупом). - Игнорирование разницы между strict и non-strict mode.
- Предположение, что стрелочные функции имеют свой
this(на самом деле они его не имеют и берут из внешнего контекста). - Забывание, что
thisв глобальном контексте модуля (ES modules) -undefined, а неwindow. - Непонимание, что при передаче метода как колбэка контекст теряется.
> Похожие задачи по frontend
Как использовать BehaviorSubject для хранения и обработки пользовательских значений
Как подписываться на изменения в BehaviorSubject и обрабатывать их
Зачем нужен промис в JavaScript и почему возникла необходимость
Для чего используются Web Worker в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью