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

如何通过循环传入的参数声明变量?解决ECharts实例初始化报错

问题描述

原本手动初始化多个ECharts实例并绑定窗口resize事件的代码如下:

let test1 = echarts.init(document.getElementById('test1'));
let test2 = echarts.init(document.getElementById('test2'));
let test3 = echarts.init(document.getElementById('test3'));
window.onresize = () => {
  test1.resize({
    height: 400,
    width: document.documentElement.clientWidth - 60,
  });
  test2.resize({
    height: 400,
    width: document.documentElement.clientWidth - 60,
  });
  test3.resize({
    height: 400,
    width: document.documentElement.clientWidth - 60,
  });
};

尝试用遍历数组实现时,在forEach循环中对参数value赋值出现「无法重新声明变量」的错误,错误代码如下:

const report = [
    'test1',
    'test2',
    'test3',
];

report.forEach((value) => {
    value = echarts.init(document.getElementById(value));
    window.onresize = () => {
        value.resize({
        height: 400,
        width: document.documentElement.clientWidth - 60,
        });
    };
});

需求是通过循环正确声明变量,解决报错问题。

解决方案

核心问题分析

  1. 直接修改forEach的参数value无意义,它是循环迭代的临时变量;且每次循环会覆盖window.onresize,最终只有最后一个实例的resize逻辑生效。
  2. 需要统一存储所有ECharts实例,绑定一次resize事件处理所有实例的尺寸调整。

正确实现方式

用数组存储所有实例,统一绑定resize事件:

const reportIds = ['test1', 'test2', 'test3'];
// 存储所有ECharts实例
const chartInstances = [];

// 初始化所有实例
reportIds.forEach(id => {
    const chart = echarts.init(document.getElementById(id));
    chartInstances.push(chart);
});

// 绑定一次resize事件,遍历所有实例执行resize
window.onresize = () => {
    const resizeOptions = {
        height: 400,
        width: document.documentElement.clientWidth - 60
    };
    chartInstances.forEach(chart => {
        chart.resize(resizeOptions);
    });
};

额外优化(可选)

如果需要保留类似原代码中独立变量的访问方式,可用对象存储实例:

const reportIds = ['test1', 'test2', 'test3'];
const charts = {};

reportIds.forEach(id => {
    charts[id] = echarts.init(document.getElementById(id));
});

window.onresize = () => {
    const resizeOptions = {
        height: 400,
        width: document.documentElement.clientWidth - 60
    };
    // 遍历对象中的所有实例执行resize
    Object.values(charts).forEach(chart => {
        chart.resize(resizeOptions);
    });
};
// 之后可通过charts.test1、charts.test2单独访问对应实例

内容的提问来源于stack exchange,提问作者Grasper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:06:22