Start · Sprachen · JavaScript · Referenz · eval()

eval()

Funktion

Wertet einen als <code>string</code> übergeben JavaScript-Ausdruck oder eine Folge von Anweisungen aus und gibt den Abschlusswert zurück.

seit JavaScript ES1 Kategorie: core

Signatur

eval(code)

Beschreibung

eval() nimmt einen String entgegen, interpretiert ihn als JavaScript-Quellcode und führt ihn im aktuellen Gültigkeitsbereich (Scope) aus. Der Rückgabewert ist der Wert des zuletzt ausgewerteten Ausdrucks; ist kein sinnvoller Wert vorhanden, wird undefined zurückgegeben. Im nicht-strikten Modus hat eval() Lese- und Schreibzugriff auf lokale Variablen des umgebenden Scopes – das macht eine statische Analyse und Optimierung durch die JavaScript-Engine unmöglich.

Direkte vs. indirekte eval: Wird eval() direkt mit diesem Namen aufgerufen, läuft der Code im lokalen Scope. Jede andere Aufrufsform (z. B. (0, eval)('...'), const e = eval; e('...')) gilt als indirekte eval und wird immer im globalen Scope ausgeführt.

In der Praxis gibt es fast immer bessere Alternativen: JSON kann mit JSON.parse() geparst werden, dynamischer Code lässt sich über Function(), dynamische Imports oder Web Workers abbilden. eval() sollte in modernem Code nicht verwendet werden, da es erhebliche Sicherheits-, Performance- und Wartungsprobleme mit sich bringt.

  • Im Strict Mode ('use strict') bekommt eval() einen eigenen Scope und kann keine neuen Variablen im umgebenden Scope anlegen.
  • Viele Deployment-Umgebungen und Content Security Policies (CSP) verbieten eval() explizit.

Parameter

Name Typ Default Beschreibung
$code Pflicht string Ein String, der gültige JavaScript-Anweisungen oder einen Ausdruck enthält. Ist der Wert kein String (z. B. eine Zahl), gibt eval() ihn unverändert zurück ohne ihn auszuwerten.

Rückgabewert

Typ
any
Beschreibung
Der Abschlusswert des ausgewerteten Codes. Bei einer Zuweisung oder einem Ausdruck ist das der zugewiesene bzw. berechnete Wert; bei reinen Anweisungen ohne Wert (z. B. if ohne Ergebnis) wird undefined zurückgegeben. Wirft der Code intern einen Fehler, wird dieser als echte Exception weiterpropagiert.

Beispiele

Einfacher Ausdruck auswerten

// Grundlegende Verwendung – nur zur Veranschaulichung
const result = eval('2 + 3 * 4');
console.log(result); // 14

const greeting = eval('"Hallo, " + "Welt!"');
console.log(greeting); // 'Hallo, Welt!'
14 'Hallo, Welt!'

Warum eval() vermieden werden sollte – sichere Alternative mit Function()

// ❌ Unsicher: eval() hat Zugriff auf den lokalen Scope
const secret = 'geheim';
const userInput = 'secret'; // könnte aus einer externen Quelle stammen
// eval(userInput) würde 'geheim' zurückgeben – unbeabsichtigter Scope-Leak!

// ✅ Besser: new Function() läuft immer im globalen Scope, kein Zugriff auf lokale Vars
const safeEval = (code) => new Function(`'use strict'; return (${code})`)();

console.log(safeEval('2 + 2'));       // 4
console.log(safeEval('"Hallo"'));    // 'Hallo'

try {
  safeEval('secret'); // ReferenceError: secret is not defined
} catch (e) {
  console.error(e.message); // secret is not defined
}
4 'Hallo' 'secret is not defined'

Verhalten im Strict Mode

'use strict';

let x = 10;

// Im Strict Mode bekommt eval() einen eigenen Scope
eval('var y = 99;');

console.log(typeof y); // 'undefined' – y wurde NICHT in den äußeren Scope geschrieben
console.log(x);        // 10 – x bleibt unberührt
'undefined' 10

// Wichtig · Fallstricke

Sicherheit (XSS): Werden Benutzereingaben oder Daten aus externen Quellen an eval() übergeben, ermöglicht das beliebige Code-Ausführung im Kontext der Seite – ein kritisches Cross-Site-Scripting-Risiko. Niemals nicht vertrauenswürdige Daten evaluieren.

Content Security Policy (CSP): Eine CSP mit script-src ohne 'unsafe-eval' blockiert eval(), setTimeout/setInterval mit String-Argument sowie new Function(). Moderne Anwendungen sollten auf 'unsafe-eval' verzichten.

Performance: JavaScript-Engines können Code, der eval() enthält, deutlich schlechter optimieren, da der Compiler nicht im Voraus wissen kann, welche Variablen im Scope verändert werden könnten.

Debugging: In eval()-Code erzeugte Fehler sind oft schwer zu debuggen, da Source Maps in der Regel nicht greifen und Stack Traces wenig aussagekräftig sind.