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 標準