ユーザ入力による四則演算をサポートしたい。
でも内部で使ってるsin,cos,tanも使いたい。
変数xを参照できるようにしたい。
でも、変な操作はできるだけ許したくない。
四則演算の実装を自分で書きたくない。
不完全ですが、こちらになります。
(function(){ var expr = "sin(x) * 3"; try{ if(!expr.match(/^(?:[0-9\+\-\*\/\(\) x]+|(?:sin|cos|tan))+$/)){ throw ""; } eval( "function f(x){ return "+ expr.replace(/sin|cos|tan/g, 'Math.$&') + "; }"); }catch(e){ alert('式を確認してください'); return; } var x = 1; return f(x); // 2.5244129544236893 })();
普通の四則演算に使われる文字と、変数でつかう'x'の文字と、それ以外の関数を正規表現で並べただけです。
一通り正規表現で見て、大丈夫そうなら、evalにかけて、
もしevalに失敗したら式見直せや、としてエラーにします。
evalに成功すると名前つきfunctionが定義されるので、それを使って実行します。
なんでいちいちfunctionにするのかというと、evalのまま使うと、
ループなどで何度も呼び出すときに毎回evalしてしまうので、結構な時間になってしまいます。
functionで定義しておけば、最初の1回だけevalするので、割と早くなります。
出来れば無名関数を返して、変数に持たせようとか思ったんだけど、
evalでは無名関数が作れないっぽいので、こんな不恰好な形になりまんた。
JavaScriptはよくわからないです。