如何解决JavaScript 中数字的因数引发 RangeError:超出最大调用堆栈大小
我想在单击按钮时计算输入数字的阶乘,但它会抛出 RangeError。
这是我的代码,它在没有 addEventListener
的情况下工作,但使用 addEventListener 它抛出错误:
var factInput = parseInt(document.getElementById("fact").value);
var factBtn = document.getElementById("btnFactorial");
factBtn.addEventListener("click",function() {
document.getElementById("output2").innerHTML = factOfANumber(factInput);
})
function factOfANumber(n) {
var fact = 0;
if (n === 1) {
return n;
} else {
fact = n * factOfANumber(n - 1);
}
return fact;
}
<div id="FactorialNumber">
<h1>2. Factorial of a Number</h1>
<input type="number" id="fact" placeholder="Enter a Number"></input>
<button id="btnFactorial">Give me Factorial</button>
<p>Output:</p>
<p id="output2"></p>
<hr>
</div>
home.js:13 Uncaught RangeError: Maximum call stack size exceeded
at factOfANumber (home.js:13)
at factOfANumber (home.js:17)
at factOfANumber (home.js:17)
at factOfANumber (home.js:17)
at factOfANumber (home.js:17)
at factOfANumber (home.js:17)......
解决方法
与其使代码变得复杂,不如通过 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>
,
这是因为在加载文档时,input
字段的值为空。当您尝试读取它的 value
并执行 parseInt()
时,它返回 NaN
,即 Not a Number
。因此,您的解决方案是将其移动到 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。