Heim > Web-Frontend > js-Tutorial > Analyse der Verwendung der Eval-Funktion in Javascript_Javascript-Kenntnissen

Analyse der Verwendung der Eval-Funktion in Javascript_Javascript-Kenntnissen

WBOY
Freigeben: 2016-05-16 16:02:19
Original
1347 Leute haben es durchsucht

In diesem Artikel wird die Verwendung der Bewertungsfunktion in JavaScript anhand von Beispielen analysiert. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:

eval() hat nur einen Parameter. Wenn der übergebene Parameter kein String ist, wird dieser Parameter direkt zurückgegeben. Andernfalls wird die Zeichenfolge als JS-Code kompiliert. Wenn die Kompilierung fehlschlägt, wird eine Syntaxfehlerausnahme (SyntaxError) ausgelöst. Wenn die Kompilierung erfolgreich ist, wird der Code ausgeführt und der Wert des letzten Ausdrucks oder der letzten Anweisung in der Zeichenfolge zurückgegeben. Wenn der letzte Ausdruck oder die letzte Anweisung keinen Wert hat, wird undefiniert zurückgegeben. Wenn die Zeichenfolge eine Ausnahme auslöst, übergibt die Ausnahme den Aufruf an eval();

Das Wichtigste an

eval() ist, dass es die Variablenbereichsumgebung verwendet, in der es aufgerufen wird, d. h. seine Operationen zum Ermitteln des Werts einer Variablen und zum Definieren neuer Variablen und Funktionen sind genau die gleichen wie im Code im lokalen Bereich.

eval("var x = 100");
eval("var y = 11");
console.log(x * y); //x * y == 1100
eval("function foo(x){return Math.pow(x,x);}");
console.log(foo(5)); // 25
Nach dem Login kopieren

Der Kontext, in dem die Auswertungszeichenfolge ausgeführt wird, ist derselbe wie der Kontext, in dem die Funktion aufgerufen wird, was die Ausführung als Teil der Funktion nicht zulässt:

var foo = function(a){
  eval(a);
  };
foo("return;");
Nach dem Login kopieren

Da der Kontext, in dem eval(a) im obigen Code ausgeführt wird, global ist, führt die Verwendung von return im globalen Kontext zu einem Syntaxfehler: return not in function.

eval() hat die Möglichkeit, lokale Variablen zu ändern, was ein großes Problem für den js-Optimierer darstellt. Um die Implementierung des js-Interpreters zu vereinfachen, schreibt der ECMAScript3-Standard vor, dass kein Interpreter eval() Aliase zuweisen darf. Wenn die Funktion eval() über einen Alias ​​aufgerufen wird, wird eine EvalError-Ausnahme ausgelöst.
Tatsächlich sind die meisten Implementierungen nicht so. Wenn eval() über einen Alias ​​aufgerufen wird, führt es seine Zeichenfolge als globalen Code der obersten Ebene aus. Der ausgeführte Code definiert möglicherweise neue globale Variablen und globale Funktionen oder weist globalen Variablen Werte zu, kann jedoch keine lokalen Variablen in der Hauptaufruffunktion verwenden oder ändern, sodass die Codeoptimierung innerhalb der Funktion nicht beeinträchtigt wird.

In ECMAScript5 ist die Einstellung anders: Es ist gegen das Auslösen einer EvalError-Ausnahme. Wenn die eval()-Funktion in ECMAScript5 direkt unter Verwendung eines unqualifizierten Namens aufgerufen wird, wird sie normalerweise als „direct eval (direct eval)“ bezeichnet. Wenn eval() direkt aufgerufen wird, wird sie immer innerhalb des Kontextbereichs ausgeführt, in dem sie sich befindet angerufen. Andere indirekte Aufrufe verwenden das globale Objekt als Kontextbereich und können lokale Variablen und Funktionen nicht lesen, schreiben und definieren. (Aber tatsächlich habe ich im Firebug-Test festgestellt, dass globale Variablen geändert wurden :( )

Es gibt nur sehr wenige Szenarien, in denen eine echte Auswertung zum Ausführen eines Codesegments erforderlich ist. Die globale Auswertung wird möglicherweise häufiger verwendet als die lokale Auswertung.

Frühe Versionen von IE vor IE9 führten keine globale Auswertung durch, wenn eval() über einen Alias ​​aufgerufen wurde, aber IE definierte eine globale Funktion von execScript(), um die Funktion der globalen Auswertung zu vervollständigen (Single-Core-eval() ist etwas anders, execScript() gibt immer null zurück).

Der strenge ECMAScript5-Modus erlegt dem Verhalten der Auswertungsfunktion mehr Einschränkungen auf. Wenn Sie Code mit eval oder eval im strikten Modus ausführen, beginnend mit der Direktive „use strict“, ist eval eine lokale Auswertung in einem privaten Kontext. Darüber hinaus listet der strikte Modus eval als reserviertes Wort auf, wodurch eval() eher einem Operator ähnelt . Die Funktion eval() kann nicht mit einem Alias ​​überschrieben werden und Variablennamen, Funktionsnamen, Funktionsparameter oder Ausnahmeerfassungsparameter können nicht „eval“ heißen.

Ich hoffe, dass dieser Artikel für das JavaScript-Programmierdesign aller hilfreich sein wird.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage