JavaScript PubSub 模式 : What is happening with the context of "this", 为什么丢失了?

标签 javascript publish-subscribe

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

采用以下场景:

单击按钮时,会发出一条消息,这有效。

document.getElementById('myBtn').addEventListener('click', function() {
    PubSub.publish('topic', data);
});

在我的应用程序的另一部分,我收到了这条消息:

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

MyObj.prototype.logger = function(message, data) {
    this.eventLog.push(data);
}

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

Uncaught TypeError: Cannot read property 'eventLog' of undefined

所以看起来 this 的上下文丢失了——当我执行 console.log(this) 时,window 对象被记录.

我知道对于初学者来说可能很棘手,但直到现在我总是能够理解正在发生的事情,但这让我完全困惑。当然 MyObj 会在消息发布之前进行初始化,所以我看不出这里有任何问题。有人可以向我解释这里发生了什么吗?

最佳答案

使用Function.prototype.bind :

 PubSub.subscribe('topic', this.logger.bind(this))

关于JavaScript PubSub 模式 : What is happening with the context of "this", 为什么丢失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30468862/

相关文章:

javascript - 如何实现Websocket?

c# - 为什么 C# EventHandler 等于 MSN 示例中的事件?

asp.net - 如何在 Web 应用程序中使用 ServiceStack Redis 以利用发布/订阅范例

javascript - 在div中显示if else函数的结果

javascript - 如何通过(lodash)路径表达式以不可变的方式从(嵌套)数组中删除元素?

javascript - 使用 URI 和 key 生成 HMAC SHA 算法

javascript - 我们可以使用母语开发Tizen TV应用程序吗?

swift - 如何使用发布主题来观察变量的值?

java - 需要使用Java RMI创建发布者-订阅者

java - 发布者/订阅者模式的并发实现