removeEventListener 在所有浏览器中都是线程安全的吗?



一旦调用了removeEventListener,是否可以安全地假设不会调用已删除的处理程序? 这是一个有点宽泛的问题,所以这里有一些具体的例子。

  1. 单击按钮,并将其单击事件调度到执行队列中。 在处理事件之前,将调用 removeEventListener,删除按钮的事件处理程序。 会发生什么?
  2. 调用一个函数,该函数需要 3 毫秒才能完成。 在此函数结束时,将调用 removeEventListener,删除按钮的单击处理程序。 在这三毫秒的时间段内,单击该按钮。 在上一个函数执行完毕后,是否会调用处理程序?

在调用 removeEventListener 的同一函数中执行清理操作是否安全,或者必须使用 setTimeout 或其他一些方法来首先确保执行队列为空? 此行为是否因浏览器而异?

相关文档也值得赞赏。 提前感谢!

只是为了让您简要了解 JavaScript 的运行方式 - 它始终是线程安全的,因为它只在单个线程上运行。

为了回答您的第一个问题,如果在调度事件后删除事件侦听器,则将调用该函数,因为处理程序回调函数最终位于调用堆栈上。有关更多信息,我建议您阅读以下内容:javascript/browser:事件调度何时发生?

为了回答你的第二个问题,removeEventListener函数是同步的,所以这意味着不可能像这样运行:

removeBrowserListener -> click -> call the event bound function

由于浏览器在完成删除事件侦听器之前会被阻止,因此当时不会记录任何点击。但即使这样,答案也不是那么明显,你应该看看这个问题,它解决了同样的问题,但从绑定事件处理程序的角度来看,而不是删除它:addEventListener 保证是同步的吗?

最新更新