我已经多次检查了这个语法,但无法弄清楚为什么函数被递归调用:
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
导致无限循环。
答案 0 :(得分:3)
由于addEventListener
位于updateNewClasses
,addNewClass
从addEventListener
调用,因此会从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"功能执行以下操作:
一旦" hashchange"事件发生在 outside 函数之外,你将开始得到不良行为。对removeEventListener
的调用只会删除在调用开始时添加的处理程序" updateNewClasses&#34 ;;在任何先前调用结束时添加的事件侦听器将保持有效,因为每次调用" updateNewClasses"导致了一个全新的" addNewClass"功能