如何实现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
相关产品推荐
相关产品推荐

