添加/删除 eventListeners,同时保持实例上下文为“this”

Add/remove eventListeners while keeping instance context of "this"

提问人:Cirrocumulus 提问时间:9/23/2021 更新时间:9/23/2021 访问量:331

问:

我正在尝试使用vanilla JS事件系统,通过将事件调度到对象,在我的浏览器应用程序的不同组件(不涉及NodeJS)之间发送事件。window

// method in Class A
sendDone() {
  window.dispatchEvent(new Event('done');
}

在另一个类中,我有一个方法来处理此事件的可选侦听器,用户可以启用/禁用该侦听器。

// method in Class B
setOption(shouldListen) {
  if (shouldListen) {
    window.addEventListener('done', this.doneHandler);
  } else {
    window.removeEventListener('done', this.doneHandler);
  }
}

但是,处理程序获取上下文而不是实例上下文,并且关键字无法按我所希望的方式工作:windowthis

// method in Class B
doneHandler() {
  this.someMethod(this.someValue);  // doesn't work
}

我无法使用匿名函数传递给处理程序,因为我无法从侦听器列表中删除匿名函数。出于同样的原因,我不能在函数定义中包含处理程序代码,如下所示:this

const self = this;
window.addEventListener('done', function() {
  // can use self here instead
  // but listener still can't be removed
});

我是 JS 的新手,我想知道通常如何处理这种情况。

谢谢。

JavaScript 事件 回调

评论


答:

1赞 Danziger 9/23/2021 #1

您需要在类的构造函数中使用 Function.prototype.bind():

constructor() {
    this.doneHandler = this.doneHandler.bind(this);
}

其余代码不会更改,因此现在可以添加和删除事件侦听器。