You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用生成器函数时触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:36:18