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

除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:15:10