基于平均分的学生成绩等级计算代码问题排查求助
代码存在的问题分析
函数未接收传入的数组参数:调用
calculateGrade(marks)时传入了数组,但函数定义function calculateGrade()未声明参数,导致函数内部使用的是全局marks变量,而非传入的参数,违背了“将数组传入函数”的设计意图。循环边界错误:循环条件
i<=marks.length会触发索引越界。数组索引从0开始,到marks.length-1结束,当i等于marks.length时,marks[i]为undefined,累加后summ会变成NaN,最终平均分计算完全错误。全局变量
summ导致重复调用异常:summ定义在函数外部,属于全局变量。多次调用calculateGrade时,summ会保留上一次的累加值,导致后续计算的总分和平均分彻底失真。平均分计算位置错误:
avg = (summ/marks.length)放在循环内部,每次循环都会用当前的部分和除以数组长度,得到的不是最终的平均分。应当在循环结束后,用总分除以数组长度计算平均分。函数无返回值却被打印:
calculateGrade内部通过console.log输出等级,但函数本身没有return语句。调用console.log(calculateGrade(marks))时,会额外打印undefined(函数默认返回值)。var的作用域问题:在循环内部用var定义avg,由于var的函数级作用域特性,会引发变量提升问题,逻辑上不够严谨,建议改用let或const并放在合适的作用域中。
修正后的代码示例
const marks = [100, 100, 80]; function calculateGrade(studentMarks) { let summ = 0; // 修正循环边界,避免索引越界 for(let i = 0; i < studentMarks.length; i++){ summ += studentMarks[i]; } // 循环结束后计算最终平均分 const avg = summ / studentMarks.length; if(avg <= 59){ return 'F'; } else if(avg >= 60 && avg <= 69){ return 'D'; } else if(avg >= 70 && avg <= 79){ return 'C'; } else if(avg >= 80 && avg <= 89){ return 'B'; } else if(avg >= 90 && avg <= 100){ return 'A'; } } // 打印函数返回的成绩等级 console.log(calculateGrade(marks)); // 输出 'A'
内容的提问来源于stack exchange,提问作者Dulanjali Senarathna
相关产品推荐
相关产品推荐

