Wie überschreibt Eval Funktion in Javascript?

8

Zum Beispiel:

%Vor%

Aber dieser Code funktioniert nicht.

    
ko1ik 02.04.2010, 13:52
quelle

6 Antworten

8

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 .

    
T.J. Crowder 02.04.2010, 14:00
quelle
10

eval ist Magie. Im Gegensatz zu einer 'echten' Funktion kann es lokale Variablen im Aufrufer lesen und schreiben:

%Vor%

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.)

    
bobince 02.04.2010 14:12
quelle
4

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 .

überschatten

Umgebungen, die die get -Anweisung von SpiderMonkey nicht unterstützen, können möglicherweise die defineProperty von ES5 verwenden. Schau dir das selbst an.

    
ELLIOTTCABLE 20.11.2012 08:27
quelle
2

Ich habe dies in FireFox 3.6.2 versucht und es scheint zu funktionieren.

Ich habe dies direkt in die FireBug-Befehlszeile eingegeben:

%Vor%     
Mark Lutton 02.04.2010 14:15
quelle
0

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.

    
Timothy Baldridge 02.04.2010 14:00
quelle
0

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.

%Vor%     
Phu Nguyen 28.03.2017 09:40
quelle

Tags und Links