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();

パフォーマンスへの影響

編集
  • コンパイル時の最適化が無効化
  • 実行時にコードを解析するためオーバーヘッドが大きい
  • 通常の関数呼び出しより大幅に遅い

推奨されない理由

編集
  1. セキュリティリスク
  2. パフォーマンスの低下
  3. デバッグの困難さ
  4. コードの可読性の低下
  5. モダンJavaScriptの設計思想に反する

代替アプローチ

編集
  • JSON.parse()
  • Function コンストラクタ
  • テンプレート文字列
  • 動的な関数生成

ブラウザ互換性

編集
  • すべてのJavaScriptエンジンでサポート
  • ECMAScript 1以降の標準機能

セキュリティガイドライン

編集
  • ユーザー入力を直接 eval() しない
  • 外部からのコード文字列は絶対に実行しない
  • 代替手段を常に検討する

仕様

編集
  • ECMAScript 仕様
  • ECMA-262 標準

脚註

編集