Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 107
4.12.1eval()
Оглавлениеeval() erwartet ein Argument. Übergeben Sie einen anderen Wert als einen String, liefert es einfach diesen Wert zurück. Ansonsten versucht es, den übergebenen String als JavaScript-Code zu parsen, und löst einen SyntaxError aus, falls dieser Versuch scheitert. Kann es den String erfolgreich parsen, wertet es den Code aus und liefert den Wert des letzten Ausdrucks oder der letzten Anweisung im String zurück oder aber undefined, wenn der letzte Ausdruck bzw. die letzte Anweisung keinen Wert hat. Löst die ausgewertete Zeichenkette eine Ausnahme aus, wird diese Ausnahme an eval() weitergereicht.
Wird eval() auf diese Weise eingesetzt (und das ist hier wesentlich), nutzt es die Variablenumgebung des Codes, aus dem es aufgerufen wird. Damit liest die Funktion Werte von Variablen auf gleiche Weise aus und definiert neue Variablen und Funktionen auf gleiche Weise wie der lokale Umgebungscode. Definiert eine Funktion eine lokale Variable x und ruft dann eval("x") auf, erhält sie den Wert der lokalen Variablen. Ruft sie eval("x=1") auf, ändert sie den Wert der lokalen Variablen. Und wenn die Funktion eval("var y = 3;") aufruft, deklariert sie eine neue lokale Variable y. Wird in der auszuwertenden Zeichenkette dagegen let oder const verwendet, gilt die deklarierte Variable oder Konstante nur lokal innerhalb von eval() (d.h. innerhalb der Auswertung) und wird nicht in der aufrufenden Umgebung definiert.
In ähnlicher Weise kann eine Funktion beispielsweise eine lokale Funktion deklarieren:
eval("function f() { return x+1; }");
Rufen Sie eval() aus Code der höchsten Programmebene auf, operiert es natürlich auf globalen Variablen und globalen Funktionen.
Beachten Sie bitte, dass der Codestring, den Sie an eval() übergeben, syntaktisch für sich stehend sinnvoll sein muss. Sie können eval() nicht nutzen, um Codefragmente in eine Funktion einzubringen. Beispielsweise ist der Ausdruck eval("return;") sinnlos, weil return nur in Funktionen erlaubt ist und der Umstand, dass der ausgewertete String die gleiche Variablenumgebung nutzt wie die aufrufende Funktion, den String nicht zu einem Teil der Funktion macht. Wäre Ihr String ein eigenständiges Skript (und sei es nur ein ganz kurzes wie x=0), dürfte er an eval() übergeben werden. Andernfalls löst eval() einen SyntaxError aus.