首頁  >  文章  >  web前端  >  聊聊JavaScript中eval()函數的用法

聊聊JavaScript中eval()函數的用法

青灯夜游
青灯夜游轉載
2021-05-25 10:14:412733瀏覽

本篇文章跟大家介紹一下JavaScript中eval()函數的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

聊聊JavaScript中eval()函數的用法

1. eval函數有什麼用?

呼叫eval函數,可以將其參數當作javascript程式來解釋。換句話說,eval可以把它的參數當作程式碼

來執行。

範例

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

在這個範例中,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'));//全局变量
}

更多程式設計相關知識,請造訪:程式設計入門! !

以上是聊聊JavaScript中eval()函數的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除