javascript - 在不使用 eval 的情况下通过字符串名称访问命名空间的 javascript 对象

标签 javascript namespaces eval

我遇到了需要从服务器访问 javascript 对象的情况。服务器返回函数或对象的字符串名称,我将根据其他元数据对对象进行不同的评估。

最初我正在评估 (eval([string])) 并且一切正常。最近我正在更新函数以不使用 eval 以确保安全安心,但我遇到了命名空间对象/函数的问题。

具体来说,我尝试用 window[name] 替换 eval([name]) 以通过全局对象的方括号语法访问对象 vs 评估

但是我遇到了命名空间对象的问题,例如:

var strObjName = 'namespace.serviceArea.function';
// if I do
var obj = eval(strObjName); // works

// but if I do
var obj = window[strObjName]; // doesn't work

谁能想出一个好的解决方案来避免将 eval 与命名空间字符串一起使用?

最佳答案

您可以拆分 . 并依次解析每个属性。只要字符串中的所有属性名称都不包含 . 字符,就可以了:

var strObjName = 'namespace.serviceArea.function';
var parts = strObjName.split(".");
for (var i = 0, len = parts.length, obj = window; i < len; ++i) {
    obj = obj[parts[i]];
}
alert(obj);

关于javascript - 在不使用 eval 的情况下通过字符串名称访问命名空间的 javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981671/

相关文章:

php - 如何使用 Symfony 表达式语言在 @Security 注释中使用类常量?

mongodb - 将查询限制为仅访问命名空间内的对象?

python - 将字符串解释为变量名(涉及类)- Python

class - 关于 Raku 中 EVAL 中的哈希绑定(bind)的问题

r - 使用包中的评估调用包装 data.table

javascript - Uncaught Error bootstrap 需要在 bootstrap.min.js 处使用 jquery

javascript - AngularJS按钮点击不触发功能

javascript - 如何有条件地将属性指令添加到子指令?

javascript - 我可以从另一个上下文的 test.each 标记模板文字中捕获测试吗?

google-app-engine - 在 GAE 数据存储中使用多个命名空间是个好主意吗?