Почему this ссылается на window?

"use strict";
window.Reciever = function (userHandler, messageHandler) {
    this.userHandler = userHandler;
    this.messageHandler = messageHandler;
};
window.Reciever.prototype.handleMessage = function (message) {
    console.log(this);
    var data = JSON.parse(message.data);
    switch (data.type) {
        case 'user':
            this.userHandler(arguments);
            break;
        case 'message':
            this.messageHandler(arguments);
            break;
        default:
            throw new Error('Type wasn\'t recognized');
    }
};

Необходимо, чтобы этот прототип находился в глобальной области видимости (знаю, что плохо, но это временное решение).
Объекту при инициализации передаются 2 функции.
Вот пример использования:
"use strict";
var reciever  = new window.parent.Reciever(Controller.user, Controller.message);

if (window.addEventListener) {
    window.addEventListener("message", reciever.handleMessage);
} else {
    // IE8
    window.attachEvent("onmessage", reciever.handleMessage);
}
  • Вопрос задан
  • 368 просмотров
Решения вопроса 2
Staltec
@Staltec
Node.js разработчик
Потому что вы передаёте reciever.handleMessage как ссылку на функцию а не вызываете её как метод объекта. Поэтому всё верно, this будет указывать на window.

Хотите получить контекст на объект, делайте так:
if (window.addEventListener) {
    window.addEventListener("message", function (message) {
        reciever.handleMessage(message); // <-вызов функции как метода объекта
    });
}

bind в данном случае тоже поможет, но вам как разработчику важно понимать поведение контекста this в JS.
Ответ написан
rmakarov
@rmakarov Автор вопроса
Помог bind. Но все же не появилось понимание того, из-за чего ошибка возникла. Буду благодарен тому, кто "ткнёт носом".
"use strict";
var reciever  = new window.parent.Reciever(Controller.user, Controller.message);

if (window.addEventListener) {
    window.addEventListener("message", reciever.handleMessage.bind(reciever));
} else {
    // IE8
    window.attachEvent("onmessage", reciever.handleMessage.bind(reciever));
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы