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

JS通过字符串访问let声明变量失败?求访问方法与优化方案

问题解决:遍历批量变量与更优数据存储方式

为什么window["info"+i]找不到变量?

你用let声明的变量不会挂载到全局的window对象上——只有var声明的全局变量才会自动成为window的属性。如果你的代码是在ES6模块里,哪怕用var也不会挂载到window,因为模块有独立的作用域,所以用window访问自然找不到目标变量。

临时解决办法(不推荐)

如果一定要沿用现有变量结构访问,可以把let改成var,这样变量会挂载到window上,你的遍历代码就能生效。但var存在变量提升、全局作用域污染等问题,不建议在现代JavaScript中使用。

更优的存储与访问方式

单独声明2000个变量属于反模式,不仅维护麻烦,还容易出错。推荐用数组或对象统一管理这些数据:

方案1:用数组存储(推荐,适合有序批量数据)

把所有数据存入数组,索引对应原变量的编号(可以让索引从1开始,避免和原变量编号混淆):

// 初始化数组,预留2001个位置(索引0不用,1-2000对应info1-info2000)
const infoArray = new Array(2001);

// 填充数据,示例:
infoArray[1] = [{"id":0, "label":"XXX"},{"id":1, "label":"XXX"}];
infoArray[2] = [{"id":0, "label":"XXX"},{"id":1, "label":"XXX"}];
// ... 直到infoArray[2000]

// 遍历方式
for (let i = 1; i <= 2000; i++) {
    console.log(infoArray[i]);
}

方案2:用对象存储(适合需要保留info1这类键名的场景)

用对象的键对应原变量名,值对应数据:

const infoMap = {
    info1: [{"id":0, "label":"XXX"},{"id":1, "label":"XXX"}],
    info2: [{"id":0, "label":"XXX"},{"id":1, "label":"XXX"}],
    // ... 直到info2000
};

// 遍历方式1:按编号遍历
for (let i = 1; i <= 2000; i++) {
    console.log(infoMap[`info${i}`]);
}

// 遍历方式2:直接遍历所有数据(不管编号)
for (const data of Object.values(infoMap)) {
    console.log(data);
}

这样做的好处:

  • 避免全局作用域被大量变量污染
  • 数据结构清晰,维护和遍历更方便
  • 性能更优,减少单个变量的内存开销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:25:31