JavaScript中遍历数组时循环调用自定义函数是否可行?
需求可行性说明
这个需求完全可以实现,基于数组遍历批量执行逻辑是JavaScript的常规操作,不需要重复声明函数或者逐个手动调用。
现有代码存在的问题
- 遍历语法使用错误:
for...of遍历数组时,循环变量拿到的直接是数组元素值,不是索引。原代码中for (let i of students)里的i实际是'John'、'Mark'这类字符串,再写students[i]相当于取students['John'],返回值必然是undefined。 - 标识符拼写错误:JavaScript对大小写敏感,定义的计算输出函数叫
yourBodyMass(B和M都是大写),循环内调用写成了yourBodymass(m小写),运行时会直接抛出函数未定义的引用错误。 - 传参缺失:
yourBodyMass定义时要求传入4个参数(姓名、BMI计算函数、体重、身高),原调用只传了2个,缺少对应学生的体重、身高值,最终计算BMI时会得到NaN。 - 循环提前终止:
for循环第一次迭代就执行了return语句,loopData函数会直接退出,永远不会处理第二个学生的数据。 - 数据匹配逻辑缺失:
students、weight、height三个平行数组是靠数组索引一一对应的,原逻辑没有按索引关联同一个学生的姓名、体重、身高,数据无法对应。
修正后代码
你可以直接用索引遍历的写法,逻辑最直观:
const students = ['John', 'Mark']; const weight = [92, 85]; const height = [1.88, 1.76]; function yourBodyMass(name, calcFunct, mass, height) { // 加toFixed(2)保留两位小数,输出更友好 console.log(`${name} your BMI is ${calcFunct(mass, height).toFixed(2)}.`); } function bodyMass(mass, height) { return mass / height ** 2; } function loopData() { // 按索引遍历,匹配三个数组同位置的数据 for (let i = 0; i < students.length; i++) { yourBodyMass(students[i], bodyMass, weight[i], height[i]); // 注意不要在循环内写return,否则会直接终止函数 } } // 调用一次即可批量输出所有学生的BMI loopData();
如果你更习惯用for...of写法,可以配合entries()同时拿到索引和元素:
function loopData() { for (const [i, name] of students.entries()) { yourBodyMass(name, bodyMass, weight[i], height[i]); } }
运行后控制台输出结果为:
John your BMI is 26.03.
Mark your BMI is 27.44.
内容的提问来源于stack exchange,提问作者HARSHU532
相关产品推荐
相关产品推荐

