在函数内部递归调用自身,是否为大型项目的良好编程实践?
问题背景
用户编写了以下JavaScript代码,尝试通过递归调用自身来获取合法的正整数输入:
function takaAnumber() { startHealth = parseInt(prompt("give a positive number ")); //here i am calling the same function inside the if()block if the input is not a number or lesser than 0 is this a good practice? if (isNaN(startHealth) || startHealth <= 0) { takaAnumber(); } // checkItsnumber(); playerHealth = startHealth; monsterHealth = startHealth; adjustHealthBars(startHealth); }
问题:在大型项目代码中,这种函数内部自调用的做法是否安全、属于良好编程实践?
递归获取输入的安全性与实践建议
这种函数自调用的递归写法不适合在大型项目中使用,核心问题如下:
- 栈溢出风险高:JavaScript的调用栈有层数上限,要是用户一直输入非法值,递归会一层叠一层,超过上限后直接触发报错,导致程序崩溃。
- 全局变量隐患大:代码里的
startHealth等变量未声明,属于全局变量。递归调用时会反复覆盖全局值,很可能出现最终赋值的是之前的非法值,而非用户最后输入的合法值,直接打乱业务逻辑。 - 调试维护成本高:递归的执行流程比循环绕得多,项目规模变大后出问题,定位排查会特别费劲。而且这种写法把输入验证和业务逻辑绑在一起,没法单独抽出来复用。
更稳妥的替代方案:用循环实现
换成while循环既安全又好维护,还能添加友好的错误提示:
function takeANumber() { let startHealth; while (true) { const input = prompt("请输入一个正整数"); startHealth = parseInt(input); // 验证通过就跳出循环 if (!isNaN(startHealth) && startHealth > 0) { break; } alert("输入无效,请重新输入正整数!"); } // 用局部变量避免全局污染 const playerHealth = startHealth; const monsterHealth = startHealth; adjustHealthBars(startHealth); }
额外优化建议:
- 所有变量用
let/const声明为局部变量,杜绝全局变量污染; - 把输入验证逻辑单独抽成独立函数(比如
validatePositiveInteger(input)),方便在其他业务场景复用。
内容的提问来源于stack exchange,提问作者itsmerj
相关产品推荐
相关产品推荐

