evalを使わずに任意のコード文字列を実行する方法です。
デモ: http://jsdo.it/butchi/akBS
my_eval.js
function myEval(expr) {
Function(expr)();
}
myEval("alert('Thanks,'); alert('world!');");
これを応用して、Math以下にある関数をメソッド名の記述だけで実行できるコードがこんな感じで書けます。
math_eval.js
function mathEval(expr) {
return Function('return Math.' + expr);
}
var f = mathEval("pow(2, 10);");
var result = f();
console.log(result);
ちなみに先ほどのコード、特に何にもバリデートしてないので、以下のように実行した場合あぶないです。
mathEval("pow(2, 10), alert('あぶない!')")();
evalを使わない方法だから安全!てわけではなく、あくまでもコード文字列を引数としてクロージャを作れるという程度のものです。
- 参考3: JS 形式の設定ファイルを読み込むときは eval の代わりに new Function を使う - たそがれ日記
- 参考4: Latest topics > evalが危険でそれ以外の方法が安全だと思ってる人へ - outsider reflex
たぶん以下のコードと全く同じです(たぶん)。
wrapped_eval.js
function wrappedEval(expr) {
(function() {
eval(expr);
})();
}
wrappedEval("alert('Thanks,'); alert('world!');");
匿名関数を短い書き方で作る方法という程度に憶えておけばいいと思います。