Javascript JS递归函数调用
如果我像这样调用函数Javascript JS递归函数调用,javascript,recursion,Javascript,Recursion,如果我像这样调用函数 var button = document.querySelector('button'); button.addEventListener('click', once); function once() { console.log('one'); button.removeEventListener('click', once); } 它只打过一次电话 但是如果我像这样调用一次() 异常抛出 异常:内部错误:递归太多 你能解释一下为什么会发生这种情况吗。(
var button = document.querySelector('button');
button.addEventListener('click', once);
function once() {
console.log('one');
button.removeEventListener('click', once);
}
它只打过一次电话
但是如果我像这样调用一次()
异常抛出
异常:内部错误:递归太多
你能解释一下为什么会发生这种情况吗。()
函数名调用后的函数。因此,button.addEventListener('click',once())
您将绑定未定义的once()
方法的返回值
由于once()
是在没有任何break语句的情况下递归调用的,因此您得到的是
您应该传递函数引用
button.addEventListener('click', once);
有关更多信息:
如果将()
放在包含函数的变量名称之后,则调用该函数
如果一个函数调用它自己,那么它将被调用,调用它自己,再次调用它自己,以此类推直到无穷远。这是递归。做一些无限的事情会导致计算机内存不足,所以这是不可取的
JavaScript引擎通过在您尝试时引发异常来防止这种情况
(当然,也有例外,可以有条件地调用自身的函数)。第一个代码是正确的,因为您注册了要调用的函数
第二个代码尝试注册函数调用的结果once()
。这意味着您实际上是在只想注册函数时执行该函数的。现在,在函数体中,执行相同的操作来取消注册回调。在这里,你再次调用你已经在执行的函数,因此,你无限递归。问题是为什么它在另一个函数中做了太多的递归case@Satpal谢谢你的回答。请您也指出Mozilla文档参考。@gvijayan,什么文档?从这里您可以立即调用ITI中包含()
的函数。如果在函数名后使用()
,则函数将被执行。当你传递给像addEventListener
或removeEventListener
这样的方法时,你不想被执行,所以只需删除它。哈哈,我喜欢它抛出的异常——“太多递归”我想说“堆栈溢出”太老套了:)
button.addEventListener('click', once);