1. ホーム
  2. javascript

[解決済み] eval()とnew Function()は同じものですか?

2022-11-28 12:47:10

質問

これらの2つの関数は、裏で同じことを行っているのでしょうか?(単一ステートメント関数で)

var evaluate = function(string) {
    return eval('(' + string + ')');
}

var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));

どのように解決するのですか?

いいえ、それらは ではない であり、同じです。

  • eval() は、現在の実行範囲内でJavaScriptの式として文字列を評価し、ローカル変数にアクセスすることができます。
  • new Function() は文字列に格納された JavaScript コードを関数オブジェクトにパースし、それを呼び出すことができます。コードは別のスコープで実行されるため、ローカル変数にアクセスすることはできません。

このコードを考えてみましょう。

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

もし new Function('return (a = 22);')() が使われていた場合、ローカル変数 a はその値を保持します。とはいえ、Douglas Crockford のような JavaScript プログラマは はどちらも使うべきではありません。 でない限り 絶対に必要 を評価・使用し Function コンストラクタを使用することは安全ではありませんし、賢明でもありません。