Die eval-Funktion ist eine leistungsstarke und einfache Möglichkeit, dynamischen Code zu erzeugen.
Antworten
Zu viele Anzeigen?-
Unsachgemäße Verwendung von eval öffnet Ihr Code für Injektionsangriffe
-
Fehlersuche kann eine größere Herausforderung sein (keine Zeilennummern, etc.)
-
eval'd Code wird langsamer ausgeführt (keine Möglichkeit, eval'd Code zu kompilieren/cachen)
Bearbeiten: Wie @Jeff Walden in den Kommentaren anmerkt, trifft Nr. 3 heute weniger zu als noch im Jahr 2008. Auch wenn eine gewisse Zwischenspeicherung von kompilierten Skripten möglich ist, beschränkt sich dies nur auf Skripte, die wiederholt und ohne Änderungen ausgewertet werden. Ein wahrscheinlicheres Szenario ist, dass Sie Skripte evaluieren, die jedes Mal leicht verändert wurden und daher nicht zwischengespeichert werden können. Sagen wir einfach, dass EINIGE eval'd Code langsamer ausgeführt wird.
Das Böse ist nicht immer böse. Es gibt Zeiten, in denen sie vollkommen angemessen ist.
Allerdings wird eval derzeit und in der Vergangenheit von Leuten, die nicht wissen, was sie tun, massiv überstrapaziert. Das schließt leider auch Leute ein, die JavaScript-Tutorials schreiben, und in einigen Fällen kann dies tatsächlich Folgen für die Sicherheit haben - oder, was häufiger vorkommt, einfache Bugs. Je mehr wir also tun können, um eval mit einem Fragezeichen zu versehen, desto besser. Jedes Mal, wenn Sie eval verwenden, müssen Sie überprüfen, was Sie tun, denn die Chancen stehen gut, dass Sie es auf eine bessere, sicherere und sauberere Weise tun könnten.
Um ein allzu typisches Beispiel zu geben, um die Farbe eines Elements mit einer in der Variablen "potato" gespeicherten ID festzulegen:
eval('document.' + potato + '.style.color = "red"');
Hätten die Autoren des obigen Codes eine Ahnung von den Grundlagen der Funktionsweise von JavaScript-Objekten, hätten sie erkannt, dass eckige Klammern anstelle von wörtlichen Punktnamen verwendet werden können, was die Notwendigkeit von eval überflüssig macht:
document[potato].style.color = 'red';
...die viel einfacher zu lesen und weniger fehleranfällig ist.
(Aber das würde jemand sagen, der /wirklich/ weiß, was er tut:
document.getElementById(potato).style.color = 'red';
was zuverlässiger ist als der fragwürdige alte Trick, auf DOM-Elemente direkt aus dem Dokumentobjekt zuzugreifen).
Zwei Punkte fallen mir dazu ein:
-
Sicherheit (aber solange Sie die auszuwertende Zeichenkette selbst generieren, dürfte dies kein Problem sein)
-
Leistung: Solange der auszuführende Code nicht bekannt ist, kann er nicht optimiert werden. (über Javascript und Leistung, natürlich Steve Yegge's Präsentation )
- See previous answers
- Weitere Antworten anzeigen