Infinte Loop - 添加和删除事件监听器

时间:2015-06-29 14:37:28

标签: javascript event-listener

我已经多次检查了这个语法,但无法弄清楚为什么函数被递归调用:

function updateNewClasses() {
  function addNewClass() {
    updateNewClasses();
  }
  window.addEventListener( "hashchange", addNewClass );
  // Conditionals being skipped; no loops
  window.removeEventListener( "hashchange", addNewClass );
  location.href = '#';
  window.addEventListener( "hashchange", addNewClass );
}

程序不断调用散列更改函数,递归调用updateNewClass导致无限循环。

2 个答案:

答案 0 :(得分:3)

由于addEventListener位于updateNewClassesaddNewClassaddEventListener调用,因此会从updateNewClasses触发,每次触发时都会添加事件监听器。

此外,您的addNewClass正在创建一个“新”updateNewClasses,在var addNewClass = function() { updateNewClasses(); } var updateNewClasses = function() { // Remove the old listener, change the hash, and add the listener again window.removeEventListener("hashchange", addNewClass); location.href = '#'; window.addEventListener("hashchange", addNewClass); } 的任何后续调用中未删除。您需要存储要添加/删除范围内的函数的函数,以便将其删除。

也许你的意思是这样的:

{{1}}

答案 1 :(得分:1)

检查语法不会发现错误,因为您的代码语法正确。

您的" updateNewClasses"功能执行以下操作:

  1. 为" hashchange"
  2. 添加事件监听器
  3. 删除该事件侦听器
  4. 触发哈希更改
  5. 再次添加事件侦听器。
  6. 一旦" hashchange"事件发生在 outside 函数之外,你将开始得到不良行为。对removeEventListener的调用只会删除在调用开始时添加的处理程序" updateNewClasses&#34 ;;在任何先前调用结束时添加的事件侦听器将保持有效,因为每次调用" updateNewClasses"导致了一个全新的" addNewClass"功能

相关问题