> Что такое this в JavaScript и как он работает в объектах и функциях? (JavaScript)

Уровень: junior · Роль: frontend · Категория: Технические вопросы

Компании: Иннотех, Kvando Technologies, VK, МТГ Бизнес решения, Rutube, Exness, TYMY, Evercode, Purrweb, Яндекс

Стек: JavaScript

> Пример ответа

Короткий ответ

this в JavaScript - это специальное ключевое слово, которое ссылается на контекст выполнения функции. Его значение определяется не тем, где функция объявлена, а тем, как она вызвана. В методах объектов this указывает на объект, через который вызван метод. В обычных функциях (в строгом режиме) this будет undefined, в нестрогом - глобальный объект. Стрелочные функции не имеют собственного this и берут его из внешнего лексического окружения.

Подробное объяснение

Значение this вычисляется в момент вызова функции, а не в момент её объявления. Это ключевое отличие от обычных переменных. Существует несколько правил определения this:

  1. Вызов как метод объекта - если функция вызывается через точку (obj.method()), this указывает на obj.
  2. Обычный вызов функции - this будет undefined в strict mode или глобальный объект (window в браузере) в нестрогом режиме.
  3. Вызов через call, apply, bind - можно явно задать this первым аргументом.
  4. Вызов через new - this ссылается на новый созданный объект.
  5. Стрелочные функции - не имеют собственного this, он наследуется из внешней функции или глобальной области видимости.

В объектах this особенно полезен для доступа к свойствам и другим методам того же объекта. Это позволяет создавать переиспользуемые методы, которые работают с данными конкретного экземпляра.

На практике

При работе с объектами важно помнить, что если вы сохраняете метод в отдельную переменную и вызываете его, контекст теряется. Например, const fn = obj.method; fn() - здесь this уже не будет указывать на obj. Для сохранения контекста используют bind, стрелочные функции или методы-обёртки.

В обработчиках событий DOM this указывает на элемент, на котором висит обработчик. Это удобно, но может привести к путанице, если обработчик определён как стрелочная функция - тогда this будет из внешнего контекста.

Пример кода

JAVASCRIPT
const user = {
name: 'Анна',
greet() {
console.log(`Привет, я ${this.name}`);
}
};
user.greet(); // Привет, я Анна
const detachedGreet = user.greet;
detachedGreet(); // Привет, я undefined (в strict mode) или window.name
const boundGreet = user.greet.bind(user);
boundGreet(); // Привет, я Анна
function showThis() {
console.log(this);
}
showThis(); // undefined в strict mode
const arrow = () => {
console.log(this);
};
arrow(); // window (в браузере, вне strict mode)

Как отвечать на собеседовании

Начните с простого определения: this - это контекст вызова функции. Затем перечислите основные правила определения значения. Обязательно упомяните разницу между обычными и стрелочными функциями. Приведите пример с потерей контекста при сохранении метода в переменную - это показывает понимание практических проблем. Если спросят про call, apply, bind - объясните разницу: call и apply вызывают функцию сразу, bind возвращает новую функцию с привязанным this.

Что проверяет интервьюер

Интервьюер проверяет, понимаете ли вы динамическую природу this и отличие от статической привязки в других языках. Важно показать, что вы знаете не только теорию, но и типичные проблемы на практике. Также проверяется понимание стрелочных функций и их поведения с this. Умение объяснить, почему this теряется при передаче метода как callback, - хороший показатель уровня.

Типичные ошибки

  • Утверждение, что this всегда указывает на объект, в котором объявлена функция - это неверно.
  • Забывают про strict mode, где this в обычной функции - undefined, а не глобальный объект.
  • Путают call и bind: call вызывает сразу, bind возвращает новую функцию.
  • Не учитывают, что стрелочные функции не имеют собственного this - попытка использовать bind на стрелочной функции не даст эффекта.
  • Потеря контекста при передаче метода как callback без явной привязки.

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

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