> Что такое this в JavaScript и как он работает в объектах и функциях? (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Иннотех, Kvando Technologies, VK, МТГ Бизнес решения, Rutube, Exness, TYMY, Evercode, Purrweb, Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
this в JavaScript - это специальное ключевое слово, которое ссылается на контекст выполнения функции. Его значение определяется не тем, где функция объявлена, а тем, как она вызвана. В методах объектов this указывает на объект, через который вызван метод. В обычных функциях (в строгом режиме) this будет undefined, в нестрогом - глобальный объект. Стрелочные функции не имеют собственного this и берут его из внешнего лексического окружения.
Подробное объяснение
Значение this вычисляется в момент вызова функции, а не в момент её объявления. Это ключевое отличие от обычных переменных. Существует несколько правил определения this:
- Вызов как метод объекта - если функция вызывается через точку (
obj.method()),thisуказывает наobj. - Обычный вызов функции -
thisбудетundefinedв strict mode или глобальный объект (windowв браузере) в нестрогом режиме. - Вызов через
call,apply,bind- можно явно задатьthisпервым аргументом. - Вызов через
new-thisссылается на новый созданный объект. - Стрелочные функции - не имеют собственного
this, он наследуется из внешней функции или глобальной области видимости.
В объектах this особенно полезен для доступа к свойствам и другим методам того же объекта. Это позволяет создавать переиспользуемые методы, которые работают с данными конкретного экземпляра.
На практике
При работе с объектами важно помнить, что если вы сохраняете метод в отдельную переменную и вызываете его, контекст теряется. Например, const fn = obj.method; fn() - здесь this уже не будет указывать на obj. Для сохранения контекста используют bind, стрелочные функции или методы-обёртки.
В обработчиках событий DOM this указывает на элемент, на котором висит обработчик. Это удобно, но может привести к путанице, если обработчик определён как стрелочная функция - тогда this будет из внешнего контекста.
Пример кода
JAVASCRIPTconst user = {name: 'Анна',greet() {console.log(`Привет, я ${this.name}`);}};user.greet(); // Привет, я Аннаconst detachedGreet = user.greet;detachedGreet(); // Привет, я undefined (в strict mode) или window.nameconst boundGreet = user.greet.bind(user);boundGreet(); // Привет, я Аннаfunction showThis() {console.log(this);}showThis(); // undefined в strict modeconst 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 без явной привязки.
> Похожие задачи по frontend
Что такое область видимости (scope) в JavaScript
Что такое Map и Set в JavaScript
Сколько типов данных в JavaScript и какие они
Что такое всплытие (hoisting) в JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью