Ответ
Ответ не найден
Ответ 18+ 🔞
Слушай, вот есть у нас в JavaScript такая штука — this. Ну, просто пиздец какой-то хамелеон, ёпта. Один день он — король, указывает на объект, а на следующий — уже сбежал в undefined, подлая тварь. И ведь хуй угадаешь, на что он сейчас покажет, пока не посмотришь, кто его вызвал.
Вот смотри, классика жанра, когда всё летит в тартарары:
const obj = {
name: 'Вася',
greet: function() {
console.log('Привет, я ' + this.name);
}
};
const greetFunc = obj.greet;
greetFunc(); // Привет, я undefined
Вот видишь? Вытащили метод greet из объекта, сунули в переменную и вызвали. А this уже не на obj смотрит, а куда-то в глобальную муть. И Вася пропал, блядь. undefined. Чистый пиздец.
А всё почему? Потому что this — это не привязанная намертво сущность, а контекст вызова, хитрая жопа. Он определяется в момент вызова функции. Не там, где функцию объявили, а там, где её, мать её, вызвали.
Вот тебе ещё пример, чтоб окончательно мозг выебало:
function showThis() {
console.log(this);
}
showThis(); // В браузере выведет `Window` или `global` в Node.js — то есть глобальный объект, ёбта!
const anotherObj = { value: 42 };
anotherObj.showThis = showThis;
anotherObj.showThis(); // А тут уже выведет { value: 42, showThis: [Function: showThis] } — сам объект!
Одна и та же функция, а this — разный. Вот такая вот, блядь, магия, от которой волосы дыбом.
Как прибить этого хамелеона гвоздями, чтобы не убежал?
Есть способы, конечно. Самый простой — bind. Приковывает this намертво, как каторжника.
const boundGreet = obj.greet.bind(obj);
boundGreet(); // Привет, я Вася. Всё, теперь Вася никуда не денется.
Или стрелочные функции — они, мудя, вообще не имеют своего this. Берут его у родительской области видимости, как милые паразиты.
const obj2 = {
name: 'Петя',
greet: function() {
setTimeout(() => {
console.log('Я всё ещё ' + this.name); // Берёт `this` из `greet`, то есть из `obj2`
}, 100);
}
};
obj2.greet(); // Через 100ms: "Я всё ещё Петя"
А если бы была обычная функция в setTimeout — опять бы this сбежал в глобальный объект, и Петю бы смыло.
Короче, запомни: this — не свойство функции, а её временная татуировка, которая появляется только в момент вызова. Не уследил — получил undefined в лучшем случае. А в худшем — ошибку, которая заставит тебя ебать свой монитор ногами. Всё просто, как три копейки, блядь.