2013-03-28 33 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