JavaScript/eval
eval()
は、文字列として渡されたJavaScriptコードを実行するグローバル関数です。引数として渡された文字列を JavaScript のコードとして解釈し、実行します。
構文
編集eval(string)
パラメータ
編集string
- 実行するJavaScriptコードを含む文字列
戻り値
編集- 実行されたコードの最後の式の評価結果
例外
編集SyntaxError
- 不正な構文の文字列が渡された場合にスローされます
基本的な使用例
編集// 文字列のコードを実行 const result = eval('2 + 2'); console.log(result); // 4 // 変数の動的な宣言と使用 eval('var dynamicVar = 42'); console.log(dynamicVar); // 42
危険性と非推奨
編集eval()
は非常に危険で、以下の重大な問題があります:
- セキュリティリスク
- パフォーマンスの低下
- デバッグの困難さ
- コードの可読性の低下
セキュリティ脆弱性
編集// 危険な使用例 const userInput = "alert('ハッキング')"; eval(userInput); // ユーザー入力を直接実行(非常に危険)
安全な代替手段
編集オブジェクトリテラルのパース
編集// 安全なJSON解析 const jsonString = '{"name": "Alice", "age": 30}'; const safeObject = JSON.parse(jsonString);
関数コンストラクタの使用
編集// Functionコンストラクタ(より安全だが依然として推奨されない) const dynamicFunc = new Function('x', 'return x * 2'); console.log(dynamicFunc(5)); // 10
高度な使用例と注意点
編集// スコープに注意 let x = 10; function complexExample() { const y = 20; eval('x += y'); // グローバルスコープの変数を変更 console.log(x); // 30 } complexExample();
パフォーマンスへの影響
編集- コンパイル時の最適化が無効化
- 実行時にコードを解析するためオーバーヘッドが大きい
- 通常の関数呼び出しより大幅に遅い
推奨されない理由
編集- セキュリティリスク
- パフォーマンスの低下
- デバッグの困難さ
- コードの可読性の低下
- モダンJavaScriptの設計思想に反する
代替アプローチ
編集JSON.parse()
Function
コンストラクタ- テンプレート文字列
- 動的な関数生成
ブラウザ互換性
編集- すべてのJavaScriptエンジンでサポート
- ECMAScript 1以降の標準機能
セキュリティガイドライン
編集- ユーザー入力を直接
eval()
しない - 外部からのコード文字列は絶対に実行しない
- 代替手段を常に検討する
仕様
編集- ECMAScript 仕様
- ECMA-262 標準