JavaScript における new Function
は、動的に関数を作成するための方法の一つです。この手法を使うことで、文字列として記述されたコードを実行可能な関数に変換することができます。この記事では、new Function
の基本的な使用方法から、セキュリティやパフォーマンスに関する懸念事項、実際の活用方法まで、完全かつ包括的に解説します。
new Function
の基本
new Function
は、関数コンストラクタを使用して新しい関数を生成します。構文は次の通りです:

javascriptlet func = new Function([arg1, arg2, ..., argN], functionBody);
ここで、arg1, arg2, ..., argN
は関数に渡す引数の名前であり、functionBody
はその関数の本体です。引数がなくても構いません。
例えば、引数として x
を受け取り、x * 2
の値を返す関数を作成する場合、次のように記述します:
javascriptlet multiplyByTwo = new Function('x', 'return x * 2');
console.log(multiplyByTwo(5)); // 10
上記のコードでは、new Function
を使って動的に関数を定義し、その関数を実行しています。
引数と関数本体
関数コンストラクタでは、関数本体に渡すコードを文字列として指定します。関数の引数は、カンマ区切りで指定することができます。複数の引数を持つ関数も定義できます。
javascriptlet addNumbers = new Function('a', 'b', 'return a + b');
console.log(addNumbers(3, 4)); // 7
このコードでは、a
と b
という2つの引数を取る関数を作成し、その合計を返します。
new Function
の使用例
new Function
の主な用途は、動的に関数を作成することです。これは、例えばユーザー入力をもとに動的にコードを生成したり、コードのテンプレートを使用して関数を作成する場合に有用です。
ユーザー入力に基づく関数生成
javascriptlet userCode = 'return a + b;';
let dynamicFunction = new Function('a', 'b', userCode);
console.log(dynamicFunction(5, 10)); // 15
ここでは、ユーザーが入力した文字列 userCode
を元に、関数を動的に生成しています。この方法では、関数本体を文字列で操作できるため、非常に柔軟なコードを書くことが可能になります。
セキュリティの懸念
new Function
の使用には、重大なセキュリティリスクが伴います。なぜなら、関数の本体が文字列として指定されるため、外部からの入力によって意図しないコードを実行してしまう可能性があるからです。
例えば、ユーザーから入力を受け取り、そのまま関数として評価すると、悪意のあるコードが実行されることがあります。以下のコードを考えてみてください:
javascriptlet userInput = 'console.log("Hacked!")';
let dangerousFunction = new Function(userInput);
dangerousFunction(); // "Hacked!" と表示される
このように、ユーザーの入力が直接コードとして実行されることで、クロスサイトスクリプティング(XSS)攻撃やその他のセキュリティリスクが発生する可能性があります。そのため、new Function
を使用する際は、入力の検証とサニタイズを徹底する必要があります。
パフォーマンスの考慮
new Function
を使用すると、関数が動的に作成されるため、通常の関数宣言に比べてパフォーマンスに影響を与えることがあります。特に、大量の関数を動的に生成する場合や頻繁に実行される場合は、パフォーマンスに注意が必要です。
比較:通常の関数 vs new Function
javascript// 通常の関数
function add(a, b) {
return a + b;
}
// new Function で作成した関数
let addDynamic = new Function('a', 'b', 'return a + b');
通常の関数はコンパイル時に定義されるため、パフォーマンスが最適化されますが、new Function
では実行時にコードが評価されるため、わずかなオーバーヘッドが生じることがあります。
new Function
の利点と欠点
利点:
-
動的に関数を作成できる:ユーザー入力や外部のテンプレートに基づいて、動的に関数を生成することができます。
-
柔軟性:関数の本体を文字列として変更できるため、非常に柔軟で拡張性の高いコードを書くことができます。
欠点:
-
セキュリティリスク:外部からの入力をそのままコードとして実行することにより、セキュリティリスクが発生します。
-
パフォーマンスの問題:動的に関数を生成するため、通常の関数に比べてパフォーマンスが低下することがあります。
代替方法
new Function
は強力ですが、使用には慎重を要します。セキュリティやパフォーマンスの問題を避けるために、できる限り以下の代替方法を使用することを推奨します。
-
高階関数:関数を引数として渡すことで、動的な関数生成のニーズに対応できます。
-
eval() の使用を避ける:
eval
関数も文字列を評価してコードを実行するものですが、同様のセキュリティリスクがあるため避けるべきです。
まとめ
new Function
は、JavaScript において動的に関数を生成するための強力なツールですが、セキュリティリスクとパフォーマンスの低下を考慮しなければなりません。特に、ユーザー入力をそのまま関数として評価する際には、十分な検証を行うことが重要です。最適な利用方法を理解し、必要に応じて代替手段を使用することで、安全で効率的なコードを実現できます。