4

我创建了一个 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.");

但是,由于新的清单版本 2,我不能再使用eval了。我想不出任何方法来操纵字符串。任何的想法?

4

2 回答 2

4

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

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

于 2013-03-28T08:27:11.493 回答
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/

于 2013-03-28T08:34:55.553 回答