我尝试创建的代码运行一个函数,该函数接受您在文本框中放置的任何值并将其因子化。当我从提示中获取值时它工作正常,但现在我试图使它看起来更整洁并从文本框中获取值,它给了我“超出最大调用堆栈大小”错误并赢得了'正确执行。我想我的函数找到文本框值并在函数中输入它有问题。
window.onerror = function(message, url, line, col) {
console.error("Error: " + message + "\nURL: " + url + "\nLine: " + line + "\nColumn: " + col);
return true;
};
var x = document.getElementById("factortext").value;
function factorial(x) {
if (x === 0) {
return 1;
}
return x * factorial(x - 1);
}
console.log(factorial(5));
document.getElementById("display").innerHTML = factorial(x);
<h1 id="title">Factorialize!</h1>
<input type="text" id="factortext" name="factor" value="Input Number here!"></input><br><br>
<button onclick="factorial()">Submit</button>
<p id="display"></p>
答案 0 :(得分:1)
您需要一个回调函数。只需让该函数调用阶乘。
您原来的onClick
函数没有参数。
window.onerror = function(message, url, line, col) {
console.error("Error: " + message + "\nURL: " + url + "\nLine: " + line + "\nColumn: " + col);
return true;
};
console.log(factorial(5));
function factorial(x) {
if (x === 0) return 1;
return x * factorial(x - 1);
}
function calculateFactorial() {
var x = document.getElementById("factortext").value;
document.getElementById("display").innerHTML = factorial(x);
}
<h1 id="title">Factorialize!</h1>
<input type="text" id="factortext" name="factor" placeholder="Input Number here!" />
<br><br>
<button onClick="calculateFactorial()">Submit</button>
<p id="display"></p>
答案 1 :(得分:0)
一旦脚本运行,您就会获得该值,而不是在按下按钮后立即获取该值。相反,设置一个单独的函数,在按下按钮时调用该函数,从输入然后获取值,将其转换为数字,然后调用factorial
并显示结果。 (例如,大多数现有代码,包含在按钮单击调用的函数中。)
答案 2 :(得分:0)
上面的其他人已经给出了解决方案,我只想解释为什么你遇到了无限循环。
当您单击该按钮时,您的代码(<button onclick="factorial()">
)将调用factorial()
而不带参数。这意味着,在函数内部,x
将为undefined
。现在,在第一行,检查严格的相等性:(x === 0)
。未定义的值不严格等于零,因此您的函数不会在此处退出;相反,它继续前进并尝试从undefined
中减去1,这会产生NaN
(“不是数字”)。然后,它以factorial()
为参数调用NaN
。同样,NaN
不等于0(NaN
的定义特征是它不等于任何东西,甚至不等于它!),所以你的函数不会退出,而是继续减去来自NaN
的1,结果是 - 您猜对了:NaN
。所以你的函数会一直持续下去,直到调用堆栈溢出。
如果您在第一行检查“假值”:
if (!x) return 1;
然后如果没有参数调用,你的函数将返回1。假值可以是0,undefined
,null
,空字符串或NaN
。