ホームページ  >  記事  >  ウェブフロントエンド  >  Eval() と New Function(): 本当に同じことをするのでしょうか?

Eval() と New Function(): 本当に同じことをするのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 00:11:29330ブラウズ

Eval() vs. New Function(): Do They Really Do the Same Thing?

eval() と new Function() の違いを調べる

JavaScript では、eval() と new Function() がよく比較されます。それらの類似点と相違点を理解するために。この記事では、それらが同じタスクを実行するかどうかを検証し、それらの異なる動作について詳しく説明します。

コード例

次のコード スニペットを考えてみましょう:

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'));

このコードでは、evaluate() は eval() を使用して文字列を JavaScript 式として評価し、func() は new Function() コンストラクターを使用して文字列から関数オブジェクトを作成し、それをすぐに実行します。

異なる機能

どちらの関数も文字列を評価しますが、同じタスクを実行するわけではありません。主な違いは次のとおりです。

  • eval():

    • 文字列を現在のスコープ内の JavaScript 式として評価します。
    • 周囲のコード ブロックで定義されたローカル変数にアクセスできます。
  • new Function():

    • 文字列を関数オブジェクトに解析します。
    • 関数を周囲のコードのローカル変数から分離して、別のスコープで実行します。

違いを強調する例

次のコードを考えてみましょう:

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

eval の代わりに new Function('return (a = 22);')() が使用された場合() の場合、 new Function() は周囲のスコープからローカル変数にアクセスしないため、ローカル変数 a は元の値を保持します。

推奨事項とセキュリティに関する考慮事項

一部Douglas Crockford などの JavaScript 開発者は、絶対に必要な場合を除き、eval() と new Function() を使用しないことを主張しています。この推奨事項は、いずれかの関数を使用して信頼できないデータを評価することには危険が伴う可能性があるため、セキュリティ上の懸念から生じています。

したがって、一般的には、eval() または new Function() に頼る前に、JavaScript コードを評価および実行するための代替方法を検討することをお勧めします。 ).

以上がEval() と New Function(): 本当に同じことをするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。