我应该总是删除EventListener吗?

Fra*_*ank 7 javascript events javascript-events

假设我load向窗口添加一个事件,如下所示:

window.addEventListener("load",initialize);
Run Code Online (Sandbox Code Playgroud)

我应该在事件被触发后从窗口中删除load事件监听器吗?它只发射一次,但在发生这种情况后会继续听吗?

这很简单:

function initialize(event_){
    /* Just by adding this line. */
    window.removeEventListener("load",initialize);
}
Run Code Online (Sandbox Code Playgroud)

但这是否过度或者实际上是否有利于我的计划的表现?我只是问,因为"加载"事件只触发一次,所以如果它只是解决了它就会有意义.我从来没有听说过一个自我解决的倾听者,但是......有什么想法吗?

编辑:另外,我并不特别关注"加载"事件,只是监听器继续监听只触发一次的事件的一般情况.

daG*_*aGo 13

window.addEventListener('load', initialize, {once: true});

  • 从那以后,我发现了这个新功能并一直在使用它。`{ once:true }` 只是告诉事件侦听器只检测一个事件,然后删除它自己。 (3认同)
  • 你能对答案做一些解释吗? (2认同)
  • 这是 2020 年,TIL 关于“一次” (2认同)

Ber*_*rgi 5

在事件被触发后,我应该从窗口中删除加载事件侦听器吗?

我从未见过这样做,所以我认为没有真正的必要。

它只触发一次,但它会在发生后继续监听吗?

它只被 DOM 触发一次,是的。但它会继续侦听,您可以轻松地load手动触发事件(参见MDN示例)。

但这是矫枉过正还是真的有利于我的程序的性能?

通常它是矫枉过正的,因为这不会产生很大的不同。当然,它可能会在 上触发垃圾收集initialize,这可以节省一些内存(或更多,取决于您的代码结构)并通过使其可用于您的应用程序的其余部分来提高性能。

  • 我还认为,当人们听到“倾听”这个词时,他们会感到困惑,因为没有人真正“倾听”(积极意义上的)任何事情。当您注册事件处理程序时,您所做的就是将一个函数附加到一个数组(在幕后)。当事件触发时,它只是检查该数组并调用其中的每个函数,因此与循环和检查是否发生了某些事情相比,这是一个巨大的收益。因此,从那里删除处理程序只会使该列表的大小更小。这确实释放了一些内存,但是,正如您所说,这有点过度设计。 (2认同)