实现狗狗日投喂量计算的hungryDog函数触发foodAmount未定义报错
代码问题定位与修复方案
触发报错的核心原因
- 变量作用域隔离问题:原代码在每个if/else分支内部用
let单独声明foodAmount,let定义的变量是块级作用域,仅在当前分支的花括号代码块内有效,一旦跳出分支块就会被回收,函数外层的return foodAmount语句完全访问不到该变量,直接触发foodAmount is not defined的报错。 - 逻辑边界适配偏差:幼犬阶段的年龄判断硬编码了近似小数阈值,会漏掉临界年龄值的计算,和投喂规则的月龄换算要求不匹配。
修复步骤
- 将
foodAmount的声明提升到函数作用域最外层,保证所有分支的赋值都能被外层return语句访问到 - 移除每个分支内部的
let重复声明,直接对函数内作用域的foodAmount赋值 - 替换幼犬阶段硬编码的小数年龄阈值,直接用月龄换算的分数值做判断,避免浮点精度导致的边界漏判
- 清理冗余的嵌套判断条件,简化分支逻辑
修复后可正常运行的代码
function hungryDog(age, weight) { // 函数作用域声明变量,覆盖所有计算分支 let foodAmount; if (age >= 1) { // 成犬投喂逻辑 if (weight <= 5) { foodAmount = weight * 0.05; } else if (weight <= 10) { foodAmount = weight * 0.04; } else if (weight <= 15) { foodAmount = weight * 0.03; } else { foodAmount = weight * 0.02; } } else { // 幼犬投喂逻辑,严格匹配月龄换算规则 if (age >= 2/12 && age <= 4/12) { foodAmount = weight * 0.10; } else if (age > 4/12 && age <= 7/12) { foodAmount = weight * 0.05; } else { foodAmount = weight * 0.04; } } return foodAmount; } // 测试用例:15磅体重、1岁年龄的返回值完全符合预期 console.log(hungryDog(1, 15)) // 输出 0.44999999999999996
内容的提问来源于stack exchange,提问作者Vinnie Taormina
相关产品推荐
相关产品推荐

