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

如何实现SetPathedVariable函数:自动创建带路径的全局变量

实现自动创建嵌套对象的SetPathedVariable函数及eval安全性说明

关于非用户输入场景下eval的安全性

如果传给eval的内容完全由你自己控制(硬编码、内部生成,无任何外部用户输入或不可信来源内容),那么eval是安全的——不存在恶意代码注入的可能,所有执行的代码都是你预先确定的。但只要有任何引入外部不可信内容的可能,就绝对不能用eval,它会直接带来极高的代码注入风险。

无需eval的SetPathedVariable实现方案

通过拆分路径字符串、遍历层级并自动创建嵌套对象的方式,就能实现需求,完全不需要依赖eval:

基础实现(全局对象场景)

function SetPathedVariable(dottedName, value) {
  const pathSegments = dottedName.split('.');
  let currentContext = window; // 浏览器环境全局对象,Node.js可替换为globalThis

  // 遍历路径的前n-1个片段,创建缺失的嵌套对象
  for (let i = 0; i < pathSegments.length - 1; i++) {
    const segment = pathSegments[i];
    // 若当前层级无该属性,则创建空对象
    if (!currentContext.hasOwnProperty(segment)) {
      currentContext[segment] = {};
    }
    currentContext = currentContext[segment];
  }

  // 给最后一个路径片段赋值
  currentContext[pathSegments[pathSegments.length - 1]] = value;
}

测试示例

调用函数后,会自动创建所有缺失的嵌套对象并完成赋值:

SetPathedVariable("GlobalVarJs.BtnHelp.SomeVariable", "Hello World");

// 验证结果
console.log(window.GlobalVarJs.BtnHelp.SomeVariable); // 输出 "Hello World"

灵活扩展(支持自定义根对象)

如果需要在局部对象而非全局对象中创建嵌套属性,可以给函数添加可选的根对象参数:

function SetPathedVariable(dottedName, value, rootContext = window) {
  const pathSegments = dottedName.split('.');
  let currentContext = rootContext;

  for (let i = 0; i < pathSegments.length - 1; i++) {
    const segment = pathSegments[i];
    if (!currentContext.hasOwnProperty(segment)) {
      currentContext[segment] = {};
    }
    currentContext = currentContext[segment];
  }

  currentContext[pathSegments[pathSegments.length - 1]] = value;
}

扩展用法示例

const myLocalObj = {};
SetPathedVariable("user.settings.theme", "dark", myLocalObj);

console.log(myLocalObj.user.settings.theme); // 输出 "dark"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 05:26:10