Была ли публикация NPM пакетов

Ответ

Ответ не найден

Ответ 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 в лучшем случае. А в худшем — ошибку, которая заставит тебя ебать свой монитор ногами. Всё просто, как три копейки, блядь.