Контекст выполнения функции — это окружение, в котором функция выполняется. В него входят переменные, объект [this], и другие данные, доступные во время выполнения. Контекст определяет, что такое [this] внутри функции. 🎯
Контекст выполнения — это одна из важнейших концепций JavaScript. Понимание этой темы помогает писать код без неожиданных ошибок с [this]. 😊
Когда JavaScript выполняет функцию, он создаёт специальное окружение — как будто у каждой функции есть своя “комнатка” со всеми нужными вещами:
function example() {
console.log(this); // Контекст выполнения
}const user = {
name: 'Иван',
greet() {
console.log(this.name); // 'Иван' — this указывает на user
}
};function calculate() {
const a = 5; // Локальная переменная в контексте
const b = 10;
return a + b;
}const person = {
name: 'Петр',
introduce() {
console.log('Меня зовут ' + this.name); // this → person
}
};
person.introduce(); // 'Меня зовут Петр' ✅function showThis() {
console.log(this); // В строгом режиме undefined
}
showThis(); // undefined или window (в нестрогом режиме)// Нестрогий режим
function nonStrict() {
console.log(this); // window (в браузере)
}
// Строгий режим
function strict() {
'use strict';
console.log(this); // undefined
}const obj = {
name: 'Иван',
greet() {
console.log('Привет, ' + this.name);
}
};
const greetFunc = obj.greet;
greetFunc(); // 'Привет, undefined' — контекст потерян! ❌
// Как если бы вы оторвали телефон от розетки и ждали, что он будет работать!const user = {
name: 'Иван',
sayHello() {
console.log(this.name); // 'Иван' ✅
}
};
user.sayHello(); // this → user
// Как если бы Иван сказал свое имя по паспортуfunction standalone() {
console.log(this); // undefined (в строгом режиме)
}
standalone(); // this → undefined
// Как если бы вы спросили "Кто это?" у анонимного письмаСтрелочные функции — это особый вид функций, которые не имеют своего [this]. Они берут [this] из внешней области видимости:
const user = {
name: 'Иван',
regularFunction() {
console.log('Обычная функция:', this.name); // 'Иван'
const arrowFunction = () => {
console.log('Стрелочная функция:', this.name); // 'Иван' тоже!
};
arrowFunction();
}
};
user.regularFunction();const obj = {
name: 'Иван',
// Стрелочная функция не имеет своего this
arrowMethod: () => {
console.log(this.name); // undefined — берет this из внешней области
},
// Обычная функция имеет свой this
regularMethod() {
console.log(this.name); // 'Иван' — this указывает на obj
}
};
obj.arrowMethod(); // undefined ❌
obj.regularMethod(); // 'Иван' ✅const user = {
name: 'Иван',
friends: ['Петр', 'Мария'],
// Без стрелочной функции теряем контекст
showFriendsBad() {
this.friends.forEach(function(friend) {
console.log(this.name + ' дружит с ' + friend); // ❌ this undefined
});
},
// Со стрелочной функцией сохраняем контекст
showFriendsGood() {
this.friends.forEach((friend) => {
console.log(this.name + ' дружит с ' + friend); // ✅ 'Иван дружит с Петр'
});
}
};const obj = {
name: 'Иван',
greet() {
console.log(this.name);
}
};
// ❌ Контекст теряется
setTimeout(obj.greet, 1000); // undefined
// Это как если бы вы отправили курьером письмо без адресата!
// ✅ Сохраняем контекст
setTimeout(() => obj.greet(), 1000); // 'Иван'
// А это как если бы курьер знал, кому передать письмо
// ✅ Или используем стрелочную функцию
setTimeout(() => {
console.log('Привет, ' + obj.name); // 'Привет, Иван'
}, 1000);// ❌ В нестрогом режиме
function bad() {
console.log(this.name); // Может работать неожиданно
// Как если бы вы пришли в гости без приглашения!
}
// ✅ В строгом режиме
function good() {
'use strict';
console.log(this); // undefined — понятно, что контекста нет
// А тут всё честно — если нет приглашения, то и не пускают!
}Понимание контекста выполнения помогает писать более предсказуемый код и избегать ошибок с [this]. Это очень важная тема для любого JavaScript разработчика! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪