繰り返し述べたように、Function コンストラクターを使用することは悪い習慣と見なされます ( ECMAScript 言語仕様、第5版、§ 15.3.2.1も参照してください)。
new Function ([arg1[, arg2[, … argN]],] functionBody)
(すべての引数は引数名を含む文字列であり、最後の (または唯一の) 文字列には関数本体が含まれます)。
要約すると、Opera チームによって説明されているように、遅いと言われています。
[…] コンストラクターがソース コードを表す文字列に対して呼び出されるたび
Function
に、スクリプト エンジンは、ソース コードを実行可能コードに変換する機構を開始する必要があります。これは通常、パフォーマンスの面でコストがかかります。たとえば、単純な関数呼び出しよりも簡単に 100 倍のコストがかかります。(マーク 'ターキン' ウィルトン ジョーンズ)
MDC のこの投稿によると、それほど悪くはありませんが(ただし、現在のバージョンの Firefox を使用して自分でテストしたわけではありません)。
クロックフォードは、次のように付け加えています。
[t]言語の引用規則により、関数本体を文字列として正しく表現することが非常に困難になります。文字列形式では、初期エラー チェックを実行できません。[…] そして、各関数は独自の独立した実装を必要とするため、メモリの無駄です。
もう一つの違いは、
Function コンストラクターによって定義された関数は、(すべての関数が継承する) グローバル スコープ以外のスコープを継承しません。( MDC )
new Function
これとは別に、動的コンテンツを使用して作成する場合は、悪意のあるコードが挿入されないように注意する必要があります。
そうは言っても、TJ Crowder は答えで次のように述べています。
[t]同様の […] new Function(...) が必要になることはほとんどありません。これも高度なエッジ ケースを除きます。
それで、今、私は疑問に思っています: これらの「高度なエッジケース」とは何ですか? Function コンストラクターの正当な使用法はありますか?