JavaScript报错TypeError: a is not iterable及数组传参问题咨询
问题分析与解决
错误原因
你遇到的TypeError: a is not iterable核心问题是函数参数的作用域:
- 你提前声明的
const a = [1,2,...]是全局变量,但函数oddNum(a)里的a是函数的局部参数——这俩是完全独立的变量,名字一样但互不影响。 - 当你调用
oddNum()时没传参数,函数内部的a会默认变成undefined,而for...of循环只能遍历数组这类可迭代对象,undefined不满足要求,所以报错。 - 调用
evenNum([1,2,...])时传了数组,函数内部的a就指向你传入的数组,自然能正常运行。
修正方案
方案1:调用函数时传入全局数组(推荐)
直接在调用oddNum时把全局的a传进去,和evenNum的调用逻辑保持一致:
const a= [1,2,3,4,5,6,7,8,9,10]; function evenNum (a){ for (let element of a){ if (element%2===0){ console.log(element); } } }; function oddNum (a){ for (let element of a){ if (element%2!=0){ console.log(element); } } }; oddNum(a); // 传入全局数组a evenNum([1,2,3,4,5,6,7,8,9,10]);
另外,你之前用console.log(oddNum())包裹函数调用是多余的——因为函数内部已经用console.log输出结果了,包裹后会额外打印undefined(函数没有返回值),直接调用函数即可。
方案2:让函数直接使用全局变量(不推荐)
如果不想传参数,可以删掉函数的参数a,这样函数内部会自动查找全局作用域里的a:
const a= [1,2,3,4,5,6,7,8,9,10]; function evenNum (a){ for (let element of a){ if (element%2===0){ console.log(element); } } }; function oddNum (){ // 去掉参数a for (let element of a){ // 这里的a就是全局数组 if (element%2!=0){ console.log(element); } } }; oddNum(); evenNum([1,2,3,4,5,6,7,8,9,10]);
但这种方式不建议多用,全局变量容易引发命名冲突,函数通过参数接收数据会更灵活、更易维护。
内容的提问来源于stack exchange,提问作者Gilles Martinet
相关产品推荐
相关产品推荐

