eval()函數用法詳解:
此函數可能使用的頻率並非過高,可是在某些狀況下具備很大的做用,下面就介紹一下eval()函數的用法。
語法結構:javascript
eval(str)
此函數能夠接受一個字符串str做爲參數,並把此str當作一段javascript代碼去執行,若是str執行結果是一個值則返回此值,不然返回undefined。若是參數不是一個字符串,則直接返回該參數,實例以下:java
eval("var a=1");//聲明一個變量a並賦值1。 eval("2+3");//執行加運算,並返回運算值。 eval("mytest()");//執行mytest()函數。 eval("{b:2}");//聲明一個對象。
在以上代碼特別注意的是,最後一個語句是聲明瞭一個對象,若是想返回此對象,則須要在對象外面再嵌套一層小括號,以下:瀏覽器
eval("({b:2})");
以上內容簡單介紹了eval()函數的用法,比較容易理解。此函數最讓人感到困惑的是關於它的做用域問題,下面就結合實例來介紹一下相關內容,先看一段代碼實例:編輯器
function a(){ eval("var x=1"); console.log(x); } a(); console.log(x);
在上面的代碼中,第一個alert()函數可以彈出1,而第二個會由於x未定義而報錯。
由以上表現能夠得出,eval()函數並不會建立一個新的做用域,而且它的做用域就是它所在的做用域。這在全部主流瀏覽器都是如此,可是有時候須要將eval()函數的做用域設置爲全局,固然能夠將eval()在全局做用域中使用,可是每每實際應用中,須要在局部做用域使用具備全局做用域的此函數,這個時候能夠用window.eval()的方式實現,例如以上代碼能夠改造以下:函數
function a(){ window.eval("var x=1"); console.log(x); } a(); console.log(x);
在上面的代碼中,兩個alert()語句都可以正常彈出1。可是此中方式在標準瀏覽器中是能夠的,可是在IE8和IE8如下瀏覽器中的表現依然和eval()同樣,做用域是它們所在的做用域。這個時候可使用IE瀏覽器獨有的window.execScript()解決IE8和IE8瀏覽器的問題。爲了實現兼容全部主流瀏覽器,把代碼改造以下:測試
function a(){ if(window.execScript){ window.execScript("var x=1"); } else{ window.eval("var x=1"); } console.log(x); } a(); console.log(x);
若是瀏覽器支持window.execScript(),則使用此函數,不支持則使用window.eval(),這樣就能夠解決IE8和IE8如下瀏覽器的問題。
特別說明:上面全部代碼建議複製到本地進行測試,可能在本編輯器內有誤。spa