JavaScript 手抜きexpr

ユーザ入力による四則演算をサポートしたい。
でも内部で使ってる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はよくわからないです。