JavaScript中数字的阶乘抛出RangeError:超出最大调用堆栈大小

JavaScript中数字的阶乘抛出RangeError:超出最大调用堆栈大小,javascript,runtime-error,factorial,Javascript,Runtime Error,Factorial,我想计算一个点击按钮输入的数字的阶乘,但它抛出了一个范围错误 这是我的代码,它在没有addEventListener的情况下工作,但在使用addEventListener时会抛出错误: var factInput=parseInt(document.getElementById(“fact”).value); var factBtn=document.getElementById(“btnFactorial”); factBtn.addEventListener(“单击”,函数(){ docu

我想计算一个点击按钮输入的数字的阶乘,但它抛出了一个范围错误

这是我的代码,它在没有
addEventListener
的情况下工作,但在使用addEventListener时会抛出错误:

var factInput=parseInt(document.getElementById(“fact”).value);
var factBtn=document.getElementById(“btnFactorial”);
factBtn.addEventListener(“单击”,函数(){
document.getElementById(“output2”).innerHTML=factOfANumber(factInput);
})
函数因子编号(n){
var-fact=0;
如果(n==1){
返回n;
}否则{
事实=n*factOfANumber(n-1);
}
返回事实;
}

2.数的阶乘
给我阶乘
输出:



不要让代码复杂化,而是使用此代码作为Onclick事件的数字阶乘

 <!doctype html>
    <html>
    <head>
    <script>
    function show(){
    
    var i, no, fact;
    fact=1;
    no=Number(document.getElementById("num").value);
    for(i=1; i<=no; i++)  
    {
    fact= fact*i;
    }  
    document.getElementById("answer").value= fact;
    }
    </script>
    </head>
    <body>
    Enter Num: <input id="num">
    <button onclick="show()">Factorial</button>
    <input id="answer">
    </body>
    </html>

函数show(){
var i,不,事实;
事实=1;
否=编号(document.getElementById(“num”).value);

对于(i=1;i这是因为当加载文档时,
输入
字段的值为空。当您尝试读取它的
并执行
parseInt()
时,它返回
NaN
,它不是一个数字
。因此,您的解决方案是将它移到
addEventListener()中
像这样:-

factBtn.addEventListener("click", function(){
    var factInput = parseInt(document.getElementById("fact").value);
    document.getElementById("output2").innerHTML = factOfANumber(factInput);
});
以下是完整的js代码:-

var factBtn = document.getElementById("btnFactorial");
factBtn.addEventListener("click", function(){
    var factInput = parseInt(document.getElementById("fact").value);
    document.getElementById("output2").innerHTML = factOfANumber(factInput);
})
function factOfANumber(n){
    var fact = 0;
    if(n===1){
        return n;
    }
    return n * factOfANumber(n-1);
}

似乎您正在为
n
使用较大的值。在这种情况下,您应该使用for循环。您需要移动
var factInput=parseInt(document.getElementById(“fact”).value)
addEventListener
回调中,否则在加载页面时只会得到一次。在开始时,它是零,这会导致无限递归(您只在
n==1
处停止,所以当
n==0
时,它永远不会停止)。非常感谢!)正如我所希望的那样,它工作得很好。我还是JavaScript新手,仍然在学习,谢谢你帮助我解决这个问题。使用递归而不是for循环不是更好吗?for循环更快。递归需要重复函数调用,相当于循环的每一次迭代都需要一个。每个函数调用都需要将信息放入堆栈中,并且当函数返回时,en再次被删除……然而,递归提供了for循环没有提供的好处。