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
相关产品推荐
相关产品推荐

