icw82
@icw82
Веб-разработчик

JS: Почему метод класса, вызванный через коллбэк, не имеет контекста?

Создаём класс и объект:
class Test {
    constructor(a) {
        this.x = a;
    }

    method() {
        console.log(this.x);
    }
}

var test = new Test(123);

Вызываем метод:
test.method();
Он напишет в консоль: 123.

Но если вызвать этот метод через коллбэк:
function wrapper(callback) {
    callback();
}
wrapper(test.method);
то вернётся ошибка: Uncaught TypeError: Cannot read property 'x' of undefined

Если это нормально, то объясните, каким образом теряется контекст?
  • Вопрос задан
  • 617 просмотров
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
потому что в JS нет классов и их методов, есть объекты и функции. Передавая "метод" объекта в качестве колбэка вы делаете его просто функцией, и она теряет свой контекст.

То есть this будет равен тому, в каком контексте мы вызываем функцию. Вызывая foo.bar() у нас контекст будет указывать на foo, но мы можем присвоить эту функцию любому объекту и таким образом сменить контекст.

Читайте про контекст вызова в JS и обретете счастье.
Ответ написан
Deodatuss
@Deodatuss
попробуйте так

wrapper(test.method.bind(test));
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
Когда-нибудь мы сможем писать так. (хотя, babel + stage-0 уже помогают в этом)
function wrapper(callback) {
    callback();
}
wrapper(::test.method); // wrapper(test.method.bind(test));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы