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);