> Куда указывает 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 ссылается на этот объект.
  • Конструктор: при вызове с new this указывает на новый создаваемый экземпляр.
  • Обработчики событий: в 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 (потеря контекста)
// Исправление через bind
const 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.
  • Непонимание, что при передаче метода как колбэка контекст теряется.

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

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