Когда ты извлекаешь метод из объекта и вызываешь его как отдельную функцию, привязка this теряется. Это происходит потому, что this определяется тем, как функция вызывается, а не где она определена.
При вызове obj.greet() JavaScript автоматически устанавливает this на obj. Однако, как только ты присваиваешь метод отдельной переменной и вызываешь его независимо, неявного контекста объекта больше нет — поэтому this становится undefined (strict mode) или глобальным объектом (window в браузерах).
const obj = { name: "John", greet() { console.log(this.name); } };
const greet = obj.greet;
greet(); // undefined (strict mode) или window.name
Есть три распространённых решения:
bind() — создаёт новую функцию с this, жёстко привязанным к указанному объектуconst greet = obj.greet.bind(obj);
greet(); // "John"
this, поэтому они наследуют его из окружающей области видимостиconst greet = () => obj.greet();
greet(); // "John"
obj.greet(); // "John"
this в JavaScript имеет динамическую область видимости — он отражает место вызова, а не место определения. Понимание этого различия критически важно для избежания тонких багов, особенно когда ты передаёшь методы как коллбэки или сохраняешь их как отдельные ссылки.
Когда метод извлекается из объекта и вызывается как отдельная функция в strict mode, this будет привязан к глобальному объекту вместо undefined.
Новый — ещё не проверен сообществом
Вы