JavaScript における eval() と new Function() の区別
JavaScript では、開発者はよく似たタスクを実行するように見える 2 つの関数に遭遇します。 : eval() と new Function()。どちらの関数も文字列をコードとして評価しますが、その基礎となるメカニズムと意味は大きく異なります。
eval() と new Function()
eval() 関数は、現在の実行スコープ内の JavaScript 式としての文字列。これは、現在のスコープで定義されたローカル変数にアクセスできることを意味します。対照的に、 new Function() は、文字列に格納された JavaScript コードを関数オブジェクトに解析し、その後呼び出すことができます。この関数オブジェクトは別のスコープで作成されるため、呼び出し環境のローカル変数にアクセスできません。
例
この違いを説明するために、次のコードを考えてみましょう。
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'));
どちらの関数も予想される結果 3 を出力します。ただし、ローカル変数を利用するようにコードを変更すると、違いが明らかになります。
function test1() { var a = 11; eval('(a = 22)'); // Modifies the local variable within the `test1` function alert(a); // Alerts 22 }
この場合、次のように使用します。評価は test1 関数のスコープ内で行われるため、 eval() はローカル変数 a を変更します。ただし、代わりに new Function('return (a = 22);')() を使用した場合、コードは別のスコープで実行されるため、ローカル変数 a は影響を受けません。
セキュリティと考慮事項
eval() と new Function() を信頼できないデータとともに使用すると、セキュリティ上のリスクが生じる可能性があることに注意することが重要です。悪意のある入力により、機密情報が漏洩したり、任意のコードが実行されたりする可能性があります。したがって、絶対に必要な場合を除き、これらの関数の使用を避けることを強くお勧めします。
結論
要約すると、JavaScript では eval() と new Function() の動作が異なります。 eval() は現在の実行スコープ内の文字列を評価し、new Function() は評価用の新しいスコープを作成します。この違いを理解することは、効果的な JavaScript プログラミングとセキュリティの維持にとって重要です。
以上がJavaScript で `eval()` と `new Function()` をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。