不使用eval()绘制图形

时间:2013-03-28 07:53:34

标签: javascript jquery graph eval

我创建了一个Chrome扩展程序,可以绘制用户输入的数学公式的图形。要轻松获得y的值,我使用了eval()(是的,我知道它很糟糕),因为这是实现它的最简单方法。

var equ = $("#equ1").val();                //some element

//let's say equ = "2(2^x) + 3x"

//some magic code
//equ becomes "2*(pow(2,x))+3*x"

for(var x = -10; x < 10; x++){
    var y = eval(equ.replace(/x/ig, x));   //calculate y value
    drawPoint(x, y);
}
console.log("Graphing done.");

但是,由于new manifest version 2,我不能再使用eval了。我想不出任何操纵字符串的方法。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

干净的方式:您可以尝试使用Jison解析表达式并从输入字符串构建AST。然后,将函数与AST节点相关联,该节点将节点表示的操作应用于给予它们的数据。这意味着您必须在语法和节点代码中明确地放置您想要支持的每个数学表达式,但另一方面,这也可以更容易地支持JS不支持的数学运算符。如果你愿意投入一些时间,这可能就是你要走的路。

肮脏的方式:如果您的扩展程序在普通网站上使用,您可以通过向网站中注入eval元素来执行某种间接<script> - 但是,这样做可能是不安全的。

答案 1 :(得分:0)

你试过New Function() ... ??

var some_logic = "2*(Math.pow(2,x))+3*x";
args = ['x', 'return (' + some_logic + ');'];
myFunc = Function.apply(null, args);

for (var x = -10; x < 10; x++) {
    var y = myFunc(x);
    console.log(x, y);
}

console.log("Graphing done.");

小提琴 - http://jsfiddle.net/atif089/sVPAH/