Проверяет понимание того, как определяется значение this во вложенной обычной функции и почему оно теряет контекст внешней функции.
В JavaScript значение this определяется не тем, где функция объявлена, а тем, как она вызвана. Это ключевое правило, которое объясняет поведение вложенных функций. Когда обычная функция вызывается как самостоятельная (не как метод объекта), её this не берётся из внешней функции, а устанавливается по правилам вызова.
obj.method() — this равен obj.fn() — this равен undefined в strict mode или глобальному объекту иначе.call, apply, bind — this задаётся явно.this берётся из внешнего лексического окружения.Вложенная обычная функция — это просто ещё одна функция. Она не «помнит» this внешней функции, потому что у обычных функций нет лексического this. Поэтому при вызове внутри метода она получит своё собственное значение this, обычно undefined или глобальный объект.
const user = {
name: 'Anna',
greet() {
console.log(this.name); // Anna
function inner() {
console.log(this.name); // undefined или ошибка
}
inner();
}
};
user.greet();Здесь inner вызывается как обычная функция, поэтому её this не связан с user. В strict mode это приведёт к ошибке при обращении к this.name, потому что this будет undefined.
this из greet.this в переменную, например const self = this;.bind.const user = {
name: 'Anna',
greet() {
const inner = () => console.log(this.name); // Anna
inner();
}
};
user.greet();Стрелочная функция не создаёт собственный this, а использует this из функции greet, где он равен user. Это самый современный и читаемый способ решения проблемы.
Итог: во вложенной обычной функции this не наследуется, а определяется вызовом. Чтобы сохранить контекст, применяйте стрелочные функции или явную привязку через bind.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию