多次调用getAverage函数时console.log结果累加问题求助
多次调用getAverage函数返回值累加的原因
问题描述
编写的getAverage函数单次调用时能返回正确平均值,但多次调用配合多个console.log时,返回值会出现累加情况,无法分别计算每组数据的平均值。
运行代码如下:
let sum = 0; const scores = []; function getAverage(scores) { for (let i = 0; i < scores.length; i++) { sum += scores[i]; } return (sum / scores.length) } console.log(getAverage([92, 88, 12, 77, 57, 100, 67, 38, 97, 89])); console.log(getAverage([45, 87, 98, 100, 86, 94, 67, 88, 94, 95]));
实际运行结果:第一个console.log正确输出71.7,但第二个输出157.1(两次结果的累加值),而非预期的85.4;若注释掉第一个console.log,第二个能正常输出预期结果。
原因分析
sum变量被声明在全局作用域中,函数每次调用时都会直接复用这个全局变量,不会自动重新初始化。- 第一次调用
getAverage时,sum累加了第一组数据的总和717,返回717/10=71.7。 - 第二次调用时,
sum没有被重置为0,而是在717的基础上继续累加第二组数据的总和854,得到717+854=1571,最终返回1571/10=157.1,这就是出现累加结果的原因。
解决方法
最合理的方案是将sum变量移到函数内部,确保每次调用函数时都会重新初始化:
const scores = []; function getAverage(scores) { let sum = 0; // 移至函数内部,每次调用都重置为0 for (let i = 0; i < scores.length; i++) { sum += scores[i]; } return sum / scores.length; } console.log(getAverage([92, 88, 12, 77, 57, 100, 67, 38, 97, 89])); // 71.7 console.log(getAverage([45, 87, 98, 100, 86, 94, 67, 88, 94, 95])); // 85.4
也可以在函数开头手动重置全局的sum为0,但这种方式依赖全局变量,容易引发其他潜在问题,不推荐:
let sum = 0; const scores = []; function getAverage(scores) { sum = 0; // 每次调用前重置sum for (let i = 0; i < scores.length; i++) { sum += scores[i]; } return sum / scores.length; }
内容的提问来源于stack exchange,提问作者Andrew McGivney
相关产品推荐
相关产品推荐

