2017-05-27 96 views
0

一旦removeEventListener被調用,是否可以安全地假定刪除的處理程序不會被調用?這是一個比較寬泛的問題,所以這裏有一些具體的例子。removeEventListener在所有瀏覽器中都是線程安全的嗎?

  1. 單擊按鈕,並將其單擊事件分派到執行隊列中。在事件可以被處理之前,removeEventListener被調用,移除按鈕的事件處理程序。怎麼了?
  2. 函數被調用,需要3毫秒才能完成。在該函數結束時,調用removeEventListener,刪除按鈕的點擊處理程序。在這三毫秒的時間內,按鈕被點擊。在上一個函數完成執行後,處理程序是否會被調用?

它是安全的執行調用removeEventListener相同功能的清理行動,或必須使用一個或的setTimeout首先確保執行隊列爲空,一些其他的方法?這種行爲在瀏覽器中有所不同嗎?

相關文檔也讚賞。提前致謝!

回答

0

只是爲了簡單瞭解JavaScript如何運行 - 它始終是線程安全的,因爲它僅在單個線程上運行。

要回答你的第一個問題,即使在調度事件後你刪除了事件監聽器,該函數也會被調用,因爲處理器回調函數在調用堆棧上結束。欲瞭解更多信息,我建議你閱讀本:javascript/browser: when does event dispatching exactly happen?

要回答你的第二個問題,removeEventListener功能是同步的,因此,這意味着,有沒有可能像這樣運行:

removeBrowserListener -> click -> call the event bound function 

因爲瀏覽器直到它完成刪除事件監聽器,因此當時沒有註冊點擊。但即使如此,答案並不那麼明顯,你應該看看這個問題,它解決了同樣的問題,但從綁定事件處理程序的角度來看,並沒有將其刪除:Does addEventListener guarantee to be synchronous?

+0

我明白了正常的Javascript執行全部發生在單個線程上,但我不確定這是否也適用於DOM事件的排隊。感謝您的鏈接,這些信息是有幫助的。 – 0x4e2

相關問題