Javascript
的 eval
函數能夠在當前做用域執行一段包含 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
定時函數 setTimeout
和 setInterval
函數均可以接受字符串做爲本身的第一個參數。在全局做用域下,這個字符串會一直被執行,在這個情形下咱們並無直接調用 eval
函數,也能夠執行字符串。segmentfault
eval
函數毫無疑問將會形成安全問題,由於它會執行任何傳給它的字符串,因此永遠不要對未知或未信任源傳來的字符串使用 eval
函數。安全
eval
函數應該儘量地避免使用。任何使用 eval
函數的代碼都應該被質疑。我以爲 @justjavac 前輩在 《js中eval()函數的用處?》 問題中的回答總結的很好,那就是「學習 eval
函數,並遠離 eval
函數」。ide