是否可以提供自定义范围添加删除变量到eval功能?

时间:2015-04-23 14:53:06

标签: javascript eval

我正在尝试使用eval()来评估带有变量和函数的数学字符串

ex:algo = "1+len+customfunction(6)"

所以我有len的数据和customFunction的函数。

它们显然在不同的范围内宣布。

我试过像

这样的东西
process = function(vars, algo) {
 return (function() {
    algo = algo.toLowerCase();
    return eval(algo);
  }).call(vars);
};

我需要向eval提供所需的函数和变量。项目在不同的范围内,我该怎么做?

现在我有点迷茫和困惑,这甚至可能吗? 我认为使用eval('var'+vName+'='+value)对于vars是可以的,但不适用于函数。

编辑:btw eval可以替换为(new Function(algo))() http://moduscreate.com/javascript-performance-tips-tricks/

2 个答案:

答案 0 :(得分:0)

我会将所需数据移动到一个对象,该对象包含所有必需的项目。任何给定的字符串都可以访问。此解决方案不需要eval()

var data = {
    customfunction: function (x) {
        return Math.PI * x * x;
    },
    len: 5
};
var variable = 'len';
if (data[variable]) {
    // do something
    ;
}
var fn = 'customFunction';
function evaluate(vars, algo) {
    if (data[algo.toLowerCase()]) { // 
        return data[algo.toLowerCase()].call(vars);
    } else {
        // fallback
    }
}
var process = evaluate(vars, algo);

答案 1 :(得分:0)

好的,我发现了:

  • 我们无法为eval提供上下文
  • eval('1 + 1')可以替换为((new Function('1 + 1'))()并且速度更快
  • eval有不同的范围,不能使用eval('var a = 1');的eval( '警报的(a)');

所以,我设法:

  • 创建一个字符串以启动所有变量:vars + ='var'+ key +'='+ JSON.stringify(value)+';'
  • 在运行时替换我的算法字符串函数及其完整路径:

    var algo = 'f(x)+5*2', x = 5;

    window.object.functions.x = function(a) { return a*2; };

    所以在运行时我将x(替换为object.functions.x( eval执行的代码最终是eval('object.functions.x(5)+5*2');,输出当然是20:)

似乎有效。