实现endangeredSpecies函数及解决‘无法读取undefined的length’报错
解决你的函数错误并完善实现
首先,咱们来拆解你遇到的Cannot read property 'length' of undefined错误:
- 你调用
endangeredSpecies('North America')时只传了一个参数,导致函数里的species参数是undefined,不过更关键的是你没有定义getStatus函数——当代码执行到status = getStatus(div[i].children, species)时,getStatus是未定义的,后续如果尝试在这个不存在的函数里读取某个undefined值的length,就会抛出这个错误。 - 另外你的函数没有任何
return语句,就算逻辑正确,调用后也拿不到结果。
下面是修正并完善后的完整代码:
function endangeredSpecies(continent, species) { // 先做参数校验,避免参数缺失导致后续出错 if (!continent || !species) { return ''; // 也可以返回自定义提示,比如'请传入完整的大洲和物种名称' } // 直接用属性选择器定位对应大洲的ul,不用遍历所有子元素,更高效 const targetUl = document.querySelector(`ul[data-continent="${continent}"]`); if (!targetUl) { return ''; // 如果找不到对应大洲的列表,返回空 } // 遍历该ul下的所有li元素,查找目标物种 const liElements = targetUl.querySelectorAll('li'); for (const li of liElements) { if (li.dataset.species === species) { return li.textContent; // 找到后直接返回状态,不用继续遍历 } } return ''; // 没找到对应物种时返回空 } // 正确调用示例 console.log(endangeredSpecies('North America', 'American bison')); // 输出 'Near Threatened' console.log(endangeredSpecies('Europe', 'Cave bear')); // 输出 'Extinct'
关键改进点:
- 添加参数校验:避免因参数缺失导致的后续逻辑错误
- 优化元素选择:使用
document.querySelector配合属性选择器直接定位目标大洲的列表,省去不必要的循环 - 内置物种查找逻辑:不再依赖外部的
getStatus函数,把查找逻辑整合到主函数里,更简洁直观 - 及时返回结果:找到目标物种后立即返回,不用遍历所有元素,提升运行效率
- 处理边界情况:找不到对应大洲或物种时返回空值(你也可以根据需求改成自定义提示信息)
另外,你之前调用函数时少传了物种参数,记得调用时要传入两个必填参数哦!
内容的提问来源于stack exchange,提问作者Vladimir Kirov
相关产品推荐
相关产品推荐

