使用生成器函数时触发Uncaught TypeError: element is undefined报错
错误原因
报错根源是maxBy函数的初始值取值逻辑有问题:
- 你传入的参数是生成器函数执行后返回的迭代器对象,这类对象不支持数组式的下标索引访问,不存在
[0]属性 - 代码执行
let maximalElement = iterable[0];时,给maximalElement赋值为undefined - 后续
for...of循环第一次执行比较逻辑时,会调用fn(maximalElement)也就是尝试读取undefined[1],直接触发Uncaught TypeError: element is undefined错误。
另外原代码里generator变量未声明,会隐式创建全局变量,属于不规范写法,但不是这次报错的直接原因。
修复方法
不要用下标索引取可迭代对象的第一个元素,改为在遍历过程中初始化最大值,适配所有可迭代类型(数组、生成器迭代器、Set、Map等),修复后代码如下:
/** * Returns the maximal element in the `iterable` as calculated by the given function * @param {Iterable} iterable - iterable to find the maximal element in * @param {function} fn - function to calculate the maximal element * * @returns {any} - maximal element in the `iterable` */ function maxBy(iterable, fn) { let maximalElement; let isFirstElement = true; for (const element of iterable) { if (isFirstElement) { maximalElement = element; isFirstElement = false; continue; } if (fn(element) > fn(maximalElement)) { maximalElement = element; } } // 空迭代器边界处理,可按需调整为返回undefined if (isFirstElement) throw new Error('Empty iterable has no max value'); return maximalElement; } // example generator function const generator = function* () { yield [3,4] yield [4,6] } maxBy(generator(), element => element[1]) // 返回 [4,6]
提示:
for...of是遍历所有可迭代对象的通用方法,下标索引仅适用于数组、类数组对象,直接对普通迭代器用下标取值会得到undefined。
内容的提问来源于stack exchange,提问作者userQWERTY
相关产品推荐
相关产品推荐

