javascript - 为什么在实现事件处理模式时 `this` 未定义?
问题描述
我正在创建一个库,我需要实现的模式之一是事件处理。我正在用 TypeScript 写作,但这个问题基本上是在 Javascript 中。考虑这段代码:
class MessageRelayer {
private readonly listeners: Array<(args: string) => void> = [];
public addListener(listener: (args: string) => void): void {
this.listeners.push(listener);
}
public relayMessage(msg: string): void {
for (const listener of this.listeners) listener(msg);
}
}
class TestClass {
private el: string;
constructor(private readonly relay: MessageRelayer) {
this.el = "example";
}
public initialize(): void {
this.relay.addListener(this.onRelayed);
}
private onRelayed(e: string): void {
console.log("EL is:", this.el);
}
}
const relay = new MessageRelayer();
const stuff = new TestClass(relay);
stuff.initialize();
relay.relayMessage("Hello world"); // Error here
运行此代码时,它给了我错误onRelayed
:
无法读取未定义的属性“el”
如果initialize
写成:
public initialize(): void {
this.relay.addListener((e: string) => { console.log("EL is:", this.el); });
}
有用。
问题
我知道这是关于著名的this
绑定问题。但是正在发生的事情不是我可以在这里解释的。我认为应该发生的是:
- 调用时
initialize()
,函数TestClass.onRelayed
被传递给MessageRelayer
. 这意味着在那一刻,this
forTestClass.onRelayed
将绑定到MessageRelayer
。 - 一旦
relayMessage
被调用,MessageRelayer
将获取TestClass.onRelayed
其this
现在指向的已保存实例MessageRelayer
,并执行它。 - 我应该得到一个
this
不包含的错误el
。
相反,我发现this
实际上是undefined
. 这里发生了什么?
解决方案
推荐阅读
- google-apps-script - 基于单元格值的重复行
- sql - SQL 查找过去 30 天的记录计数,按以下方式分组
- html - 使用 62.5% 作为 html root 使用 rem 真的安全吗?这是否意味着 100% 的浏览器默认字体大小为 16 像素?
- sql - 错误:关系“vinyls”不存在,但在 psql 中有效
- python - 将两个参数传递到 url 元素中,同时运行循环以获取 webscrape 数据
- android - Android 属性仅适用于样式?
- android - androids studio sqlite 问题与 selectionArgs 参数
- java - 如何使用java代码在资产中动态创建JSON文件或使用android中的java代码更新现有的json文件
- python-3.x - 如何根据另一列的某些条件在数据框中添加列?
- python - 从 cookie 中提取 Httponly、Secure、域和路径