Ответ
Ответ не найден
Ответ 18+ 🔞
А, ну ты попал, дружище! Сейчас я тебе такую простыню накатаю, что сам потом офигеешь. Сиди, слушай, не перебивай.
Значит, история такая, блядь. Есть у нас в JavaScript такая штука — this. И вот эта сука, ёпта, ведёт себя как последняя манда с ушами. Ты думаешь, что она всегда указывает на объект, в котором функция объявлена? А вот нихуя! Она, эта хитрая жопа, указывает на то, кто её вызвал. Понимаешь разницу? Это как если ты позвал кота: «Кис-кис!», а к тебе прибежал соседский пёс и начал тебе в штаны срать. Вот это и есть this. Полная непредсказуемость, волнение ебать.
Смотри, вот пример, от которого у меня терпения ноль ебать:
const user = {
name: 'Вася',
sayHi() {
console.log(`Привет, я ${this.name}`);
}
};
user.sayHi(); // Всё ок, выведет "Привет, я Вася". `this` — это `user`.
Вроде логично, да? this внутри sayHi — это объект user. Но теперь, блядь, смотри сюда:
const greet = user.sayHi; // Скопировали метод в переменную, БЕЗ вызова!
greet(); // Выведет "Привет, я undefined". Потому что `this` теперь — глобальный объект (или `undefined` в strict mode).
Видишь, что происходит? Мы просто взяли функцию и вызвали её отдельно от объекта. И this тут же накрылся медным тазом. Она потеряла контекст, как пьяный мужик в подворотне теряет ключи от квартиры. Это называется «потеря контекста», и это, блядь, главная причина, почему все так ненавидят this.
А теперь представь, что ты передаёшь этот метод как колбэк, например, в setTimeout:
setTimeout(user.sayHi, 1000); // Через секунду: "Привет, я undefined". Охуеть, да?
Функция user.sayHi передаётся внутрь setTimeout, а когда таймер срабатывает, он вызывает её сам, от своего имени. И контекст — прощай! Это пиздец, Карл.
Так как же с этим бороться, спросишь ты? А вот так, ёбаный в рот!
-
Привязка через
.bind(). Это как приковатьthisнаручниками к нужному объекту.const boundSayHi = user.sayHi.bind(user); // Намертво привязали `this` к `user` setTimeout(boundSayHi, 1000); // Теперь выведет "Привет, я Вася". Ура! -
Стрелочные функции. Вот это, блядь, спасение. Они не имеют своего
this. Они берут его из окружающего контекста, как умные дети, и больше не теряют. Это как кот, который привязан к дому верёвочкой.const user = { name: 'Вася', sayHi() { // Стрелочная функция внутри берёт `this` из sayHi, то есть из `user` setTimeout(() => console.log(`Привет, я ${this.name}`), 1000); } }; user.sayHi(); // Через секунду: "Привет, я Вася". Красота!
Короче, чувак, мораль всей этой басни про this проста, как три копейки: если не хочешь неожиданностей — либо бинди всё нахуй, либо используй стрелочные функции. И тогда этот хуй с горы перестанет тебе мозги выносить. А иначе будешь как тот Гамлет, только вместо «быть или не быть» у тебя будет «undefined или не undefined». Всё, я устал, иди делай домашки.