我创建了一个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了.我想不出任何操纵字符串的方法.任何的想法?
解决方法:
干净的方式:您可以尝试使用Jison解析表达式并从输入字符串构建AST.然后,将函数与AST节点相关联,该节点将节点表示的操作应用于给予它们的数据.这意味着您必须在语法和节点代码中明确地放置您想要支持的每个数学表达式,但另一方面,这也可以更容易地支持JS不支持的数学运算符.如果你愿意投入一些时间,这可能就是你要走的路.
肮脏的方式:如果您的扩展程序在普通网站上使用,您可以通过注入< script>来进行某种间接评估.元素进入网站左右 – 然而,这可能是不安全的.