Signatur
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') bekommteval()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
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!'
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
}
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
// 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.