使用窗口执行公式而不是使用eval

时间:2016-04-20 17:38:09

标签: javascript eval

我的代码需要执行论坛(如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)"以及字符串。

2 个答案:

答案 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的答案就和其他任何答案一样好。真正的问题是,您需要信任来自外部源的代码才能在您的应用上下文中运行,这可能会带来安全风险。