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

时间:2017-05-27 18:26:22

标签: javascript multithreading dom-events

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

  1. 单击一个按钮,将其click事件分派到执行队列中。在处理事件之前,调用removeEventListener,删除按钮的事件处理程序。会发生什么?
  2. 调用一个函数,需要3毫秒才能完成。在此函数的末尾,调用removeEventListener,删除按钮的单击处理程序。在此三毫秒期间,单击按钮。在前一个函数执行完毕后是否会调用处理程序?
  3. 在调用removeEventListener的同一函数中执行清理操作是否安全,或者必须使用setTimeout或其他首先确保执行队列为空的方法?这种行为在浏览器中有所不同吗?

    我们也非常感谢相关文件。提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

要回答第一个问题,如果在调度事件后删除事件侦听器,则会调用该函数,因为处理程序回调函数最终会在调用堆栈上结束。有关详细信息,我建议您阅读:javascript/browser: when does event dispatching exactly happen?

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

removeBrowserListener -> click -> call the event bound function

因为浏览器在完成删除事件侦听器之前被阻止,所以此时没有注册任何点击。但即便如此,答案也不是那么明显,你应该看看这个问题,它解决了同样的问题,但从绑定事件处理程序的角度来看,而不是删除它:Does addEventListener guarantee to be synchronous?