1. eval函數會計算傳給的字符串, 並把做爲腳本代碼來執行。瀏覽器
eval(str)
此函數接受一個字符串做爲參數,並把str當作一段JavaScript腳本代碼來執行,若是str執行結果返回一個值則返回此值,不然返回undefined。函數
在eval()函數裏,它會將JavaScript代碼進行編譯,若是編譯失敗則拋出語法錯誤異常。若是編譯成功可是若是這個代碼沒有值的話,eval()最終返回的結果是underfined。若是字符串拋出一個異常,則這個異常將把該調用傳遞給eval()。spa
eval("var a=1");//聲明一個變量a並賦值1。 eval("2+3");//執行加運算,並返回運算值。 eval("mytest()");//執行mytest()函數。 eval("{b:2}");//聲明一個對象。
var ob = '{ "name":"wuhan", "age":18 }';
var op = eval("("+ob+")"); // {name: "wuhan", age: 18}
2. eval函數做用域,先看一個例子3d
function ab() { eval("var x = 1"); console.log(x); // 1 }
ab(); console.log(x); // Uncaught ReferenceError: x is not defined
結論: 由以上表現能夠得出,eval()函數並不會建立一個新的做用域,而且它的做用域就是它所在的做用域。這在全部主流瀏覽器都是如此。code
可是有時候須要將eval()函數的做用域設置爲全局,固然能夠將eval()在全局做用域中使用,可是每每實際應用中,須要在局部做用域使用具備全局做用域的此函數,這個時候能夠用window.eval()的方式實現。對象
例子以下blog
function ab() { window.eval("var x = 1"); console.log(x); // 1 } ab(); console.log(x); // 1
在標準瀏覽器中,x如今是全局變量,可是在IE8瀏覽器下是會報錯的ip
此時能夠使用IE瀏覽器獨有的window.execScript()解決IE8和IE8瀏覽器的問題。作用域
兼容函數以下: 字符串
function testEval() { if(window.execScript){ window.execScript("var a = 180"); }else{ window.eval("var a = 1000"); } console.log(a,'函數內部'); } testEval(); console.log(a,'函數外部');
標準瀏覽器打印結果
IE8瀏覽器打印結果