> Что такое контекст (this) в JavaScript (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: YADRO, Garage Eight, циан, Soft_Media_Group, VK, Инити, Aston, Kaspersky, Centicore, IT-One, EdenAI, Сбер, TYMY, HolyWeb, Purrweb, ООО Снэп АйТи
Стек: JavaScript
> Пример ответа
Короткий ответ
this в JavaScript - это специальное ключевое слово, которое ссылается на объект, в контексте которого была вызвана функция. Значение this определяется не тем, где функция объявлена, а тем, как она вызвана. В глобальной области видимости this ссылается на глобальный объект (window в браузере, global в Node.js), а в строгом режиме в обычной функции - undefined.
Подробное объяснение
this - это динамический контекст выполнения. Его значение зависит от способа вызова функции:
- Обычный вызов функции -
thisссылается на глобальный объект (илиundefinedв strict mode). - Вызов как метод объекта -
thisссылается на объект, через который вызван метод. - Вызов через
call,apply,bind-thisзадаётся явно первым аргументом. - Вызов через
new-thisссылается на новый созданный объект. - Стрелочные функции - не имеют собственного
this, они наследуют его из внешней лексической области видимости.
Важно понимать: this не привязывается к функции навсегда. Одна и та же функция может иметь разный this в зависимости от того, как её вызвали.
На практике
В реальной frontend-разработке this часто встречается в обработчиках событий, методах классов и при работе с DOM. Например, в обработчике события this ссылается на элемент, на котором висит обработчик. В классах this используется для доступа к полям и методам экземпляра.
При работе с React важно помнить, что методы класса не привязаны автоматически - нужно использовать стрелочные функции или явный bind, иначе this потеряется при передаче метода как callback.
Пример кода
JAVASCRIPT// Обычный вызовfunction showThis() {console.log(this); // window (или undefined в strict mode)}showThis();// Метод объектаconst user = {name: 'Анна',greet() {console.log(this.name); // 'Анна'}};user.greet();// call / applyfunction introduce(city) {console.log(`${this.name} из ${city}`);}introduce.call(user, 'Москва'); // 'Анна из Москва'// bindconst boundGreet = user.greet.bind(user);boundGreet(); // 'Анна'// Стрелочная функцияconst arrow = () => {console.log(this); // лексический this (внешний контекст)};
Как отвечать на собеседовании
Начни с простого определения: this - это контекст вызова функции. Затем перечисли основные правила определения значения this (вызов как метод, обычный вызов, new, call/apply/bind, стрелочные функции). Приведи короткий пример для каждого случая. Если спросят про стрелочные функции - обязательно упомяни, что они не имеют собственного this и берут его из внешней области видимости.
Хорошо показать понимание разницы между динамическим и лексическим контекстом. Можно добавить, что в классах this работает так же, как в методах объектов, но есть нюанс с потерей контекста при передаче метода как callback.
Что проверяет интервьюер
Интервьюер проверяет:
- понимание, что
this- это динамическая привязка, а не ссылка на саму функцию; - знание всех способов вызова функции и их влияния на
this; - понимание разницы между обычными и стрелочными функциями;
- умение объяснить, почему
thisтеряется в обработчиках событий и как это исправить; - знание
call,apply,bindи их отличий.
Типичные ошибки
- Утверждение, что
thisвсегда ссылается на объект, где объявлена функция - это неверно. - Забывают про strict mode, где
thisв обычной функции -undefined. - Путают
callиapply(разница только в передаче аргументов: список vs массив). - Не знают, что стрелочные функции нельзя использовать с
call,apply,bindдля измененияthis. - Думают, что
thisвнутри вложенной функции ссылается наthisвнешней функции - это не так (если не использовать стрелочную функцию или сохранениеthisв переменную).
> Похожие задачи по frontend
В чем разница между var, const и let в JavaScript
Что такое каррирование
Что такое event loop в JavaScript и как он работает с микрозадачами и макрозадачами
Как реализовать в HTTP заголовках сервис, который принимает JSON и отвечает текстом
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью