Heim > Web-Frontend > js-Tutorial > Hauptteil

Detaillierte Codebeispiele zur Verwendung der globalen Funktion eval() in JavaScript

伊谢尔伦
Freigeben: 2017-07-25 11:37:40
Original
1459 Leute haben es durchsucht

Die dynamische Bestimmung von Zeichenfolgen im Quellcode ist eine sehr leistungsstarke Sprachfunktion, deren Anwendung in der Praxis nahezu unnötig ist. Wenn Sie eval() verwenden, sollten Sie sorgfältig überlegen, ob Sie es wirklich verwenden müssen.

1. Ist eval() eine Funktion oder ein Operator?

eval() ist eine Funktion, aber weil es so betrachtet wurde eine Operation, zu deren Behandlung Fu kam. . Frühe Versionen der JavaScript-Sprache definierten die Auswertungsfunktion, und moderne JavaScript-Interpreter führen umfangreiche Codeanalysen und -optimierungen durch. Das Problem bei eval besteht darin, dass der für die dynamische Ausführung verwendete Code im Allgemeinen nicht analysiert werden kann. Mit anderen Worten: Wenn eine Funktion eval aufruft, kann der Interpreter die Funktion nicht weiter optimieren und eval als weiteren Teil der Funktion definieren dass ihm ein anderer Name gegeben werden kann, var f=eval; dann kann der Interpreter keine Funktion, die f() aufruft, sicher optimieren. Wenn eval ein Operator ist, können diese Probleme vermieden werden.

2. eval()

eval() hat nur einen Parameter. Wenn der übergebene Parameter kein String ist, wird diese Funktion direkt zurückgegeben. Wenn der Parameter eine Zeichenfolge ist, wird die Zeichenfolge als JavaScript-Code kompiliert und eine Syntaxfehlerausnahme ausgelöst, wenn die Kompilierung fehlschlägt. Wenn die Kompilierung erfolgreich ist, wird dieser 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 schließlich undefiniert zurückgegeben. Wenn die Zeichenfolge eine Ausnahme auslöst, übergibt diese Ausnahme den Aufruf an eval().

Das Wichtigste an eval ist, dass es die Umgebung mit variablem Gültigkeitsbereich verwendet, in der es aufgerufen wird. Das heißt, es sucht nach den Werten von Variablen und definiert neue Variablen und Funktionen genauso wie Code im lokalen Bereich. Wenn eine Funktion eine lokale Variable x definiert und dann eval("x") aufruft, gibt sie den Wert der lokalen Variablen zurück. Wenn es eval("x=1") aufruft, ändert es den Wert der lokalen Variablen. Wenn die Funktion eval(“var y=2;”) aufruft, deklariert sie eine neue lokale Variable y. Ebenso kann eine Funktion eine lokale Variable durch den folgenden Code deklarieren:

eval(“function f () {return x+1;}“);

Wenn eval im Code der obersten Ebene aufgerufen wird, wirkt es sich natürlich auf globale Variablen und globale Funktionen aus.

Es ist zu beachten, dass die an eval übergebene Zeichenfolge grammatikalisch konsistent sein muss. Sie können beispielsweise keine beliebigen Codefragmente in die Funktion einfügen eine Rolle innerhalb einer Funktion, und tatsächlich ist der Kontext, in dem die Zeichenfolge von eval ausgeführt wird, derselbe wie der Kontext, in dem die Funktion aufgerufen wird, sodass sie nicht als Teil der Funktion ausgeführt werden kann. Wenn die Zeichenfolge als separates Skript semantisch ist, besteht kein Problem darin, sie als Parameter an eval zu übergeben. Andernfalls löst eval eine Syntaxfehlerausnahme aus.

3. Global eval()

eval() hat die Möglichkeit, Layoutvariablen zu ändern, was ein großes Problem für JavaScript-Optimierer darstellt. Als Notlösung führt der JavaScript-Interpreter jedoch keine große Optimierung für Funktionen durch, die eval aufrufen. Doch wie funktioniert der JavaScript-Interpreter, wenn ein Skript einen Alias ​​für eval definiert und diesen unter einem anderen Namen aufruft? Um die Implementierung von JavaScript-Interpretern zu vereinfachen, schreibt der ECMAScript3-Standard vor, dass kein Interpreter Aliase für eval zuweisen darf. Wenn die Auswertungsfunktion über einen Alias ​​aufgerufen wird, wird eine EavlError-Ausnahme ausgelöst.

Tatsächlich tun dies die meisten Implementierungen nicht. Beim Aufruf über einen Alias ​​führt eval seine Zeichenfolge als globalen Code der obersten Ebene aus. Der ausgeführte Code kann neue globale Variablen und globale Funktionen definieren oder globalen Variablen Werte zuweisen, kann jedoch keine lokalen Variablen in der aufrufenden Funktion verwenden oder ändern. Daher hat dies keinen Einfluss auf die Codeoptimierung innerhalb der Funktion.

ECMAScript5 ist gegen die Verwendung von EavlError und standardisiert das Verhalten von eval, „direct eval“. Wenn die Funktion eval() direkt mit dem unqualifizierten Namen „eval“ aufgerufen wird, wird sie normalerweise „direct eval“ genannt. ". Wenn eval() direkt aufgerufen wird, wird es immer im Rahmen des Kontexts ausgeführt, in dem es aufgerufen wird. Andere indirekte Aufrufe verwenden das globale Objekt als Kontextbereich und können keine lokalen Variablen und Funktionen lesen, schreiben oder definieren. Hier ist ein Beispielcode:

var geval=eval;                //使用别名调用evla将是全局eval
var x="global",y="global";    //两个全局变量
function f(){                //函数内执行的是局部eval
    var x="local";            //定义局部变量
    eval("x += ' chenged';");//直接使用eval改变的局部变量的值
    return x;                //返回更改后的局部变量
}
Function g(){                //这个函数内执行了全局eval
    var y="local";
    geval("y += ' changed';"); //直接调用改变了全局变量的值
    return y;
}
console.log(f(),x);            //改变了布局变了,输出 “local changed global”
console.log(g(),y);            //改变了全局变量,输出    “local global changed”
Nach dem Login kopieren

Diese Verhaltensweisen der globalen Auswertung sind nicht nur ein Kompromiss aus Gründen der Codeoptimierung, sondern tatsächlich eine sehr nützliche Funktion, die es uns ermöglicht, globale Skriptschnipsel ohne auszuführen etwaige Abhängigkeiten vom Kontext. Es gibt nur sehr wenige Szenarien, in denen eine Auswertung wirklich erforderlich ist, um ein Codesegment auszuführen. Aber wenn Sie die Notwendigkeit wirklich erkennen, ist es wahrscheinlicher, dass Sie die globale Auswertung anstelle der lokalen Auswertung verwenden.

4. Strikte Bewertung()

Der strenge ECMAScript5-Modus erlegt dem Verhalten der Funktion eval() und sogar der Verwendung des Bezeichners eval mehr Einschränkungen auf. Wenn eval im strikten Modus aufgerufen wird oder das von eval ausgeführte Codesegment mit einer „Use strict“-Direktive beginnt, handelt es sich bei eval hier um eine lokale Auswertung im privaten Kontext. Das heißt, im strikten Modus kann das von eval ausgeführte Codesegment lokale Variablen abfragen oder ändern, aber keine neuen Variablen oder Funktionen im lokalen Bereich definieren.

Darüber hinaus listet der strikte Modus „eval“ als reserviertes Wort auf, was eval() eher zu einem Operator macht. Die Funktion eval() kann nicht mit einem Alias ​​überschrieben werden. Und Variablennamen, Funktionsnamen. Weder Funktionsparameter noch Ausnahmeerfassungsparameter können als eval bezeichnet werden.

Das obige ist der detaillierte Inhalt vonDetaillierte Codebeispiele zur Verwendung der globalen Funktion eval() in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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