除eval与document外,JS/TS如何从数组生成可引用的动态变量名?
解决方案:用对象存储动态变量(替代eval与全局对象)
首先修正你初始代码的问题:环境数组的元素应该是字符串(否则会因未定义标识符报错),且直接修改数组元素的写法有误。
核心思路
在闭包内创建一个普通对象,将动态生成的"变量名"作为对象的属性名,属性值设为你需要的内容。这种方式完全避开eval和全局对象(如window),不会触发代码扫描工具的误报,同时满足后续直接引用的需求。
实现代码
// 闭包环境(比如函数内部) function setupEnvVars() { // 正确定义环境名称数组(元素为字符串) const envs = ['dev', 'test', 'uat', 'stage', 'prod']; // 创建闭包内的对象存储动态变量 const envVars = {} as Record<string, string>; // 遍历数组生成变量 for (let i = 0; i < envs.length; i++) { const envName = envs[i]; // 给对象添加属性,属性名就是环境名,值为带前缀的字符串 envVars[envName] = `prefix${envName}`; } // 后续代码中直接引用对象属性 // 示例:调用newThing envs.forEach((env, index) => { newThing(`${envVars[env]}${index}`, otherParams); }); // 如果需要把这些变量暴露出去,返回envVars即可 return envVars; } // 使用示例 const myEnvVars = setupEnvVars(); console.log(myEnvVars.dev); // 输出 "prefixdev" console.log(myEnvVars.test); // 输出 "prefixtest"
为什么这是最优解
- 完全规避
eval:不存在代码注入风险,也不会触发代码扫描工具的误报 - 不依赖运行环境:浏览器、Node.js等所有JS/TS运行时都能正常工作
- 符合语言规范:JS/TS中动态管理变量的标准方式就是使用对象属性,而非动态创建独立变量
- 易于维护:所有动态变量集中在一个对象中,便于追踪和修改
补充说明
如果你确实需要在闭包内创建独立的变量(而非对象属性),但由于变量名是动态的,这种场景下JS/TS本身并不推荐直接实现(会导致代码可读性差、难以维护)。对象存储的方式已经能完全满足你后续调用newThing的需求,是更合理的选择。
内容的提问来源于stack exchange,提问作者BangsKeyboards
相关产品推荐
相关产品推荐

