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汚い方法: 拡張機能が通常の Web サイトで使用されている場合、Web サイトに要素を挿入するなどして何らかの間接的な操作を実行できる可能性がありますが<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 に答える