Sie können nicht. (Es gibt einen begrenzten Weg, es zu tun, aber es ist ziemlich begrenzt und behält nicht die Magie bei, dass bobince spricht über .)
eval
ist keine echte JavaScript-Funktion in mindestens einer größeren Implementierung (IEs JScript, zumindest nicht über IE7; habe die neue IE8-Version nicht getestet), also wirst du sofort loslegen in Schwierigkeiten, weil Sie nicht in der Lage sein werden, das Original über apply
aufzurufen (das ist nicht wirklich wichtig für eval
).
Die aktuelle ECMAScript 5-Spezifikation verbietet explizit das Überschreiben von eval
im strikten Modus (nicht, dass Sie dort den strikten Modus verwenden), was mich vermuten lässt, dass es sehr gute Gründe gibt, sie nicht zu überschreiben .
eval
ist Magie. Im Gegensatz zu einer 'echten' Funktion kann es lokale Variablen im Aufrufer lesen und schreiben:
Ersetze eval
durch eine proxied-Funktion und du hast ein Problem: a+= 1
wird im Bereich der proxied
-Funktion anstelle von foo
ausgeführt. Abhängig davon, was im bewerteten Code passiert, was dazu führen kann, dass Werte verloren gehen, was die lokalen, zufälligen globalen Variablen des Proxys usw. beschädigt.
Es ist daher unmöglich, eval
durch einen voll funktionsfähigen Proxy zu ersetzen. (Für einfache Fälle, die die Einheimischen nicht brauchen, können Sie damit durchkommen.)
Obwohl nicht portierbar, funktioniert der folgende Ansatz an einigen Stellen, an denen er andernfalls nicht funktioniert (da er die Anforderungen von ES5 erfüllt, dass A) als Referenz in einer MemberExpression abgerufen wird, nicht als Wert und B) als Ergebnis. Standard eingebaute Funktion. "- ES5 # 15.1.2)
%Vor% Dies gilt natürlich nur, wenn Sie den Client-Code in eine with () -Anweisung einfügen können; obwohl das in vielen Situationen nicht schwer sein sollte. Offensichtlich kann derselbe Ansatz window
mit einem anderen Objekt mit all seinen Eigenschaften und einem Getter-Proxy eval
.
Umgebungen, die die get
-Anweisung von SpiderMonkey nicht unterstützen, können möglicherweise die defineProperty
von ES5 verwenden. Schau dir das selbst an.
Ich habe dies in FireFox 3.6.2 versucht und es scheint zu funktionieren.
Ich habe dies direkt in die FireBug-Befehlszeile eingegeben:
%Vor%Du solltest das nicht nur tun, aber ich denke auch, dass du es wahrscheinlich nicht kannst. Erstens ist eval eine globale Funktion und als solche kein Mitglied des Fensters (wie Sie oben versucht haben). Zweitens ist es sehr wahrscheinlich, dass es als globale Funktion fest in die VM eingebunden ist und nicht überschrieben werden kann.
Vielleicht habe ich die Frage nicht richtig verstanden, aber ich übergehe eval()
, indem ich eine myEval()
-Funktion mit dem ursprünglichen eval()
darin erstelle und zusätzliche Schritte in myEval()
ausführe.
Tags und Links javascript eval override