使用FindAverageValue库遇list未定义错误,请求排查解决
问题分析与解决
错误根源
- 命名空间不匹配:测试代码调用的是
FindAverageValue.findAverage(),但自定义库中并未创建FindAverageValue这个命名空间对象,仅定义了全局函数findAverage,导致找不到目标方法。 - 无参数触发未定义错误:库代码最后一行
findAverage()未传入任何参数,此时函数内的list变量为undefined,直接访问list.length就会触发类型错误。
修复方案
方案1:匹配命名空间(推荐,避免全局污染)
修改自定义库代码,将函数挂载到FindAverageValue对象上,同时移除无参数的无效调用:
// 定义命名空间对象,防止重复定义覆盖 var FindAverageValue = FindAverageValue || {}; // 将函数挂载到命名空间 FindAverageValue.findAverage = function(list) { // 增加参数有效性校验,避免非数组传入报错 if (!Array.isArray(list) || list.length === 0) { return 0; } var sum = 0; // 循环累加列表元素 for (var i = 0; i < list.length; i++) { sum += list[i]; } var average = sum / list.length; console.log(average); return average; };
测试代码无需修改,保持原调用方式即可正常运行:
var list = [42, 23, 32, 11]; var average = FindAverageValue.findAverage(list); console.log("Average value: " + average);
方案2:直接调用全局函数
如果不需要命名空间,修改测试代码直接调用全局函数findAverage,同时移除库中的无参数调用:
修改后的测试代码:
var list = [42, 23, 32, 11]; var average = findAverage(list); console.log("Average value: " + average);
修改后的库代码:
function findAverage(list) { if (!Array.isArray(list) || list.length === 0) { return 0; } var sum = 0; for (var i = 0; i < list.length; i++) { sum += list[i]; } var average = sum / list.length; console.log(average); return average; } // 移除无参数的findAverage()调用
额外优化建议
可以用Array.reduce替代for循环,让累加逻辑更简洁:
FindAverageValue.findAverage = function(list) { if (!Array.isArray(list) || list.length === 0) { return 0; } var sum = list.reduce((total, num) => total + num, 0); var average = sum / list.length; console.log(average); return average; };
内容的提问来源于stack exchange,提问作者Lord Ryan
相关产品推荐
相关产品推荐

