Heim >Web-Frontend >js-Tutorial >Lassen Sie uns über die Verwendung der Funktion eval() in JavaScript sprechen

Lassen Sie uns über die Verwendung der Funktion eval() in JavaScript sprechen

青灯夜游
青灯夜游nach vorne
2021-05-25 10:14:412762Durchsuche

Dieser Artikel stellt Ihnen die Verwendung der Funktion eval() in JavaScript vor. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Lassen Sie uns über die Verwendung der Funktion eval() in JavaScript sprechen

1. Wozu dient die Bewertungsfunktion?

Der Aufruf der Auswertungsfunktion und ihrer Parameter kann als Javascript-Programm interpretiert werden. Mit anderen Worten: eval kann seine Parameter als Code ausführen

.

Beispiel

function f(x) {
    eval('var y=x');
    console.log('y:', y);
}
f('hello');//y:hello

In diesem Beispiel führt eval seinen string-Parameter var y=x als Codezeile in der Funktion f deklariert intern eine lokale Variable y. Dies ist im Grunde der gleiche Ausführungseffekt wie eval将它的string参数var y=x作为一行代码执行了,在函数f内部声明了一个局部变量y。这和

function f(x) {
    var y=x;
    console.log('y:', y);
}
f('hello');//y:hello

的执行效果基本相同。

2. 避免使用eval函数创建局部变量

允许eval函数干扰作用域,是一个相当错误的做法。这种做法会使一段代码变得难以理解,并且不再安全。下面这个例子便赋予了外部调用者修改局部变量,改变局部作用域的能力。

例子

let g = '全局变量'
function f(src) {
    eval(src);
    console.log('g:', g);
}
//以上为源代码
f("var g= '局部变量'");//g:局部变量
f("var y= '局部变量'");//g:全局变量

当我们把一个没有在源代码中定义的变量y,传入eval函数时,这段代码执行的结果将变得难以预测。

保证eval函数不影响外部作用域的一个简单方法是使用嵌套的作用域。ES5的严格模式便是这样做的。

例子

let g = '全局变量'
function f(src) {
   (()=> eval(src))();//在嵌套作用域中执行eval
    console.log('g:', g);
}
//以上为源代码
f("var g= '局部变量'");//g:全局变量
f("var y= '局部变量'");//g:全局变量

3. eval函数的两种调用方式

3.1 直接调用方式:

当函数调用涉及eval标识符时,可以称为直接调用。此时,被执行的程序(eval的参数)具有完全访问调用者局部作用域的权限。

例子

const g = '全局变量';
function foo() {
    const g = '局部变量';
    console.log(eval('g'));//直接调用,可以访问到foo的局部作用域,所以输出的是局部变量g
}
foo(); //局部变量

3.2 间接调用方式:

绑定eval到另一个变量名,在通过该变量调用eval,称之为间接调用。此时,被执行的程序(eval的参数)失去对局部作用域的访问能力。利用逗号操作符,

const g = '全局变量';
function foo2() {
    const g = '局部变量';
    cont test = eval;
    //间接调用,不能访问函数内部的变量g
    console.log(test('g')); //全局变量
    //间接调用简洁方式
    console.log((0, eval)('g'));//全局变量
}

.

2. Vermeiden Sie die Verwendung der Eval-Funktion zum Erstellen lokaler Variablen.

Zuzulassen, dass die Eval-Funktion den Bereich beeinträchtigt, ist ein völlig falscher Ansatz. Dieser Ansatz kann dazu führen, dass ein Codeabschnitt schwer verständlich und nicht mehr sicher ist. Das folgende Beispiel gibt externen Aufrufern die Möglichkeit, lokale Variablen zu ändern und den lokalen Bereich zu ändern.

🎜Beispiel🎜🎜rrreee🎜Wenn wir eine Variable y, die nicht im Quellcode definiert ist, an die Funktion eval übergeben, wird das Ergebnis der Ausführung dieses Codes angezeigt werden sehr unvorhersehbar. 🎜🎜Eine einfache Möglichkeit, sicherzustellen, dass die Funktion eval keine Auswirkungen auf den äußeren Bereich hat, ist die Verwendung verschachtelter Bereiche. Der strikte Modus von ES5 erledigt dies. 🎜🎜🎜Beispiel🎜🎜rrreee🎜🎜3. Zwei Möglichkeiten, die Eval-Funktion aufzurufen🎜🎜🎜🎜3.1 Direktaufrufmethode: 🎜🎜🎜Wenn der Funktionsaufruf die Kennung eval beinhaltet, kann er aufgerufen werden direkter Anruf. Zu diesem Zeitpunkt hat das ausgeführte Programm (die Parameter von eval) vollen Zugriff auf den lokalen Bereich des Aufrufers. 🎜🎜🎜Beispiel🎜🎜rrreee🎜🎜3.2 Indirekte Aufrufmethode: 🎜🎜🎜Binden Sie eval an einen anderen Variablennamen, rufen Sie dann eval über die Variable auf und nennen Sie es einen indirekten Aufruf. Zu diesem Zeitpunkt verliert das ausgeführte Programm (die Parameter von eval) die Möglichkeit, auf den lokalen Bereich zuzugreifen. Mit den Kommaoperatoren , erreichen Sie eine prägnante Schreibweise indirekter Aufrufe. 🎜🎜🎜Beispiele🎜🎜rrreee🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Einführung in die Programmierung🎜! ! 🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Verwendung der Funktion eval() in JavaScript sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen