JavaScript では、eval() 関数を使用して文字列内の JavaScript コードを解析し、対応するコードの実行結果を返すことができます。
基本的に、eval() は JavaScript グローバル オブジェクトの関数です。たとえば、上記のコードは次と同等です:
ただし、 eval() ステートメントを使用する場合、通常は上記の最初の方法、つまりグローバル オブジェクトを無視して eval() を直接使用する方法が採用されます。
eval() の使用法
次の 2 つの理由により、本当に必要な場合を除き、コード内で eval() ステートメントを使用することは避ける必要があります。
1. 論理的に言えば、文字列はプログラムの実行中にコンテンツと情報を保存するために使用されるべきであり、特定の計算ロジックを保存するために使用されるべきではありません。
2. eval() パラメータは文字列であり、文字列は字句的に処理できないため、JavaScript インタプリタは eval() 呼び出しステートメントを最適化できません。
eval() の戻り値
eval() の戻り値は次の規則に従います:
1. eval() のパラメータが文字列でない場合、eval() はパラメータを直接返します。
2. eval() のパラメータが文字列の場合、eval() はその文字列をコードに解析して実行し、コード実行の最後の行の結果を返します。
3. 文字列を正当なコードに解析できない場合、eval() は SyntaxError をスローします。
4. 文字列を正当なコードに解析できても、このコードの実行中にエラーが報告された場合、そのエラーは eval() ステートメントに報告され、eval() によってスローされます。
console.log(eval("42 * 2; 22 * 3;"));//66. eval は最後の式/ステートメントの結果を返します
console.log(eval("null.toString()"));//TypeError、eval されたコードの例外は eval() の外部に伝播されます。
変動する環境
JavaScript の Eval() には重要な機能があります。eval() パラメーター文字列内のコードは外部コード内の変数にアクセスでき、パラメーター文字列コード内に新しく作成された変数を外部コードに公開することもできます。つまり、eval() パラメータ文字列を合法的に解析できる場合、JS は eval() が配置されている行を解析されたコードで置き換えます:
上記の機能を実現するための前提条件は、eval() パラメータ文字列内のコードが合法的に解析できることであることに注意してください。コードの正しい構文に加えて、JS では eval() パラメータ文字列内のコードが「自己完結型」であることも必要です。つまり、コードはパラメータ文字列内のコードに関する限りにおいてのみ意味を持つ必要があります。たとえば、「return;」などの文字列を eval() 関数に渡すことはできません。
ただし、IE6、7、および 8 では動作が異なることに注意してください。 IE6、7、8では、eval()関数の名前を変更しても「ローカル変数環境」がそのまま使用されます。