細說 Javascript 拾遺篇(一) : 遠離 eval 函數

Javascripteval 函數能夠在當前做用域執行一段包含 Javascript 代碼的字符串。java

var foo = 1;
function test() {
    var foo = 2;
    eval('foo = 3');
    return foo;
}
test(); // 3
foo; // 1

然而,eval 函數只有在當前做用域中直接被調用而且被調用的函數名爲 eval 纔會被執行。git

var foo = 1;
function test() {
    var foo = 2;
    var bar = eval;
    bar('foo = 3');
    return foo;
}
test(); // 2
foo; // 3

eval 函數的使用應該被避免,99.9% 使用 eval 函數所實現的功能均可以經過不使用 eval 函數來實現。github

假裝的 eval 函數

定時函數 setTimeoutsetInterval 函數均可以接受字符串做爲本身的第一個參數。在全局做用域下,這個字符串會一直被執行,在這個情形下咱們並無直接調用 eval 函數,也能夠執行字符串。segmentfault

安全問題

eval 函數毫無疑問將會形成安全問題,由於它會執行任何傳給它的字符串,因此永遠不要對未知或未信任源傳來的字符串使用 eval 函數。安全

總結

eval 函數應該儘量地避免使用。任何使用 eval 函數的代碼都應該被質疑。我以爲 @justjavac 前輩在 《js中eval()函數的用處?》 問題中的回答總結的很好,那就是「學習 eval 函數,並遠離 eval 函數」。ide

參考

http://bonsaiden.github.io/JavaScript-Garden/#core.eval函數

相關文章
相關標籤/搜索