JavaScript PubSub模式:"this"的上下文发生了什么,它为什么会丢失?

Sve*_*ven 3 javascript publish-subscribe

我开始尝试使用JavaScript中的发布/订阅模式,但现在面临一个我不明白的问题.

采取以下方案:

在按钮单击时,会发出一条消息,这是有效的.

document.getElementById('myBtn').addEventListener('click', function() {
    PubSub.publish('topic', data);
});
Run Code Online (Sandbox Code Playgroud)

在我的应用程序的另一部分中,我收到此消息:

function MyObj() {
    this.eventLog = [];
    var token = PubSub.subscribe('topic', this.logger);
};

MyObj.prototype.logger = function(message, data) {
    this.eventLog.push(data);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我想将已发布的数据存储eventLogMyObj对象的属性中.不幸的是,这不起作用:

Uncaught TypeError: Cannot read property 'eventLog' of undefined
Run Code Online (Sandbox Code Playgroud)

所以似乎this丢失了上下文- 当我这样做时console.log(this),window对象被记录下来.

我知道this对初学者来说可能很棘手,但直到现在我总能理解发生了什么,但这让我完全不解.当然MyObj,在消息发布之前进行初始化,所以我在这里看不到任何问题.有人可以向我解释一下这里发生了什么吗?

Dav*_*ing 5

用途Function.prototype.bind:

 PubSub.subscribe('topic', this.logger.bind(this))
Run Code Online (Sandbox Code Playgroud)