我的代码需要执行论坛(如Math.pow(1.05, mainObj.smallObj.count)
)。
我的道路是:
var path = mainObj.smallObj.count;
你可以看到。
如果需要,我的代码可以从这个路径中拆分所有变量名,并将它放在一个数组中,如下所示:
var path = ["mainObj", "smallObj", "count"];
由于我不想使用eval
(这会导致内存泄漏,因为它会每秒多次调用),如何从window
访问它?
尝试window["path"]
或window.path
等内容。
如果总是不清楚,请告诉我。
提前感谢您的帮助。
编辑:忘了告诉一些配置是用JSON编写的,所以当我们采用公式时,它被解释为"Math.pow(1.05, mainObj.smallObj.count)"
以及字符串。
答案 0 :(得分:0)
我想说有更好的解决方案然后eval
,但这取决于如何构建 forumla 。它可以使用new Function
进行预编译(这也是某种 eval ),但允许多次调用它,而无需为每次调用重新编译。如果做得好,它应该比eval
更好。
你可以这样做:
var formula = {
code : 'Math.pow(1.05, mainObj.smallObj.count)',
params : ['mainObj']
}
var params = formula.params.slice(0);
params.push('return '+formula.code);
var compiledFormula = Function.apply(window, params);
//now the formula can be called multiple times
var result = compiledFormula({
smallObj: {
count: 2
}
});
答案 1 :(得分:0)
您可以通过递归使用括号表示法来协调path
部分:
window.mainObj = { smallObj: { count: 2 } };
var path = ["mainObj", "smallObj", "count"];
var parse = function (obj, parts) {
var part = parts.splice(0, 1);
if (part.length === 0) return obj;
obj = obj[part[0]];
return parse(obj, parts);
};
var value = parse(window, path);
alert(value);

基本上,parse
只是从数组中拉出第一个元素,使用括号表示法来获取该对象,然后使用新缩短的数组再次运行它。一旦完成,它只返回上次运行的结果。
这回答了关于路径的大部分问题。如果你试图解释其余的字符串,那么@ t.niese的答案就和其他任何答案一样好。真正的问题是,您需要信任来自外部源的代码才能在您的应用上下文中运行,这可能会带来安全风险。