> Приведите пример разницы this и замыкания в JavaScript (JavaScript)

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

Компании: Exness

Стек: JavaScript

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

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

this определяется контекстом вызова функции (call-site) и может меняться динамически, а замыкание (closure) - это способность функции запоминать свою лексическую область видимости, независимо от того, где и как она вызывается. this зависит от того, кто вызвал функцию, замыкание - от того, где функция была объявлена.

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

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

Замыкание - это комбинация функции и её лексического окружения. Когда функция объявлена внутри другой функции, она "замыкает" переменные внешней функции, даже после завершения выполнения внешней функции. Замыкание не зависит от того, как вызывается функция - оно всегда имеет доступ к переменным из места своего объявления.

Ключевое различие: this - динамический механизм, замыкание - статический (лексический). this может быть переопределён при каждом вызове, замыкание фиксируется при создании функции.

На практике

В реальном коде путаница между this и замыканием часто приводит к багам в обработчиках событий, колбэках и методах объектов. Например, при передаче метода объекта как колбэка this теряет ссылку на объект, а замыкание продолжает работать корректно. Для сохранения this используют bind, стрелочные функции или замыкание с сохранением self = this.

Пример кода

JAVASCRIPT
// Пример с this
const obj = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
const greetFn = obj.greet;
greetFn(); // Hello, undefined - this потерян
// Пример с замыканием
function createGreeter(name) {
return function() {
console.log(`Hello, ${name}`);
};
}
const greetClosure = createGreeter('Bob');
greetClosure(); // Hello, Bob - замыкание сохраняет name
// Смешанный случай
function createMethod() {
const self = this; // замыкание для сохранения this
return function() {
console.log(self.name);
};
}

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

Начни с чёткого определения обоих понятий. Подчеркни, что this - динамический, замыкание - лексическое. Приведи конкретный пример, где различие критично (например, потеря контекста в колбэке). Объясни, как стрелочные функции стирают это различие, так как они не имеют собственного this и используют замыкание для его захвата. Упомяни, что понимание этой разницы необходимо для работы с React-компонентами, обработчиками событий и асинхронным кодом.

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

Интервьюер проверяет понимание ключевых механизмов JavaScript: контекст выполнения, область видимости, лексическое окружение. Он хочет убедиться, что кандидат не путает динамическое связывание this с лексическим связыванием переменных через замыкание. Также оценивается способность объяснить разницу на практических примерах и знание способов управления this (bind, arrow functions, self pattern).

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

  • Утверждение, что this всегда определяется местом объявления функции (на самом деле - местом вызова).
  • Смешивание понятий: "замыкание - это когда функция запоминает this" (замыкание запоминает переменные, а не this).
  • Игнорирование разницы между обычными и стрелочными функциями в контексте this.
  • Предположение, что this внутри замыкания автоматически ссылается на внешний объект.

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

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