2013-03-28 34 views
4

我创建了一个Chrome扩展,可以绘制用户输入的数学公式的图形。为了轻松获得y的价值,我使用了eval()(是的,我知道这是不好的),因为实现它的最简单的方法。不使用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了。我想不出任何方法来操纵字符串。任何想法?

+4

一个疯狂的想法是将[解析它(http://stackoverflow.com/questions/2932016/parsing-of-mathematical-expressions)... – Passerby 2013-03-28 08:29:27

+1

所以EVAL消失了,但是生成一个函数呢?我猜是这样吗? – MaxArt 2013-03-28 08:34:33

+0

工作在@Passerby这个疯狂的想法,我打了一个粗劣的黑客:http://jsfiddle.net/FfC3t/。它对你有帮助吗? – Rikonator 2013-03-28 14:47:49

回答

4

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

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

+0

使用Jison可能是最好的选择。 PS:刚注意到CoffeeScript总是使用Jison来解析他们的代码。 :) – 2013-03-29 05:54:18

+0

@Derek朕会功夫正确地说,在咖啡文本中窃听是我知道jison的原因。 :) – thejh 2013-03-29 09:53:21

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/

+3

它们本质上是一样的,我认为Google Chrome清单不会抛弃'eval',而是保留'new Function'。而他们没有:http://developer.chrome.com/extensions/tut_migration_to_manifest_v2.html – 2013-03-28 08:42:38

+0

嗯...抱歉:| – 2013-03-28 09:21:04