使用 window 来执行公式而不是使用 eval

Use window to execute a formula instead of using eval

我的代码需要执行一个 forumla(比如 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)" 所以是一个字符串。

我想说有比 eval 更好的解决方案,但这取决于 forumla 的结构。它可以是 precompiled 使用 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
  }
});

您可以使用括号表示法递归地协调 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 只是从数组中取出第一个元素,使用方括号表示法获取该对象,然后 运行 再次使用新缩短的数组对其进行处理。一旦完成,它只是 returns 无论最后 运行 的结果是什么。


这回答了您关于路径的大部分问题。如果您试图解释字符串的其余部分,@t.niese 的答案与其他答案一样好。真正的问题是您在您的应用上下文中信任来自外部源的代码 运行,这可能存在安全风险。