Javascript中eval方法的應用及其問題。

  1. 認識eval()方法
    eval()是js Functions裏面的一個方法。和其他很多解釋性語言一樣,JavaScript同樣可以解釋運行由JavaScript源代碼組成的字符串,併產生一個值。JavaScript通過全局函數eval()來完成這個工作。eval()可以計算某個字符串,並執行其中的javascript代碼。
  2. eval()的用法
    eval()方法只有一個參數,而且它只接受字符串作爲這個參數,如果這個參數不是字符串,那麼它將直接返回這個函數。如果該參數是一個函數,它會把字符串當成JavaScript代碼進行編譯,如果編譯失敗則拋出一個語法錯誤異常。如果編譯成功,則開始執行這一段代碼,並返回字符串中的最後一個表達式會或語句的值,如果最後一個表達式或語句沒有值,則最終返回undefined。如果字符串拋出一個異常,這個異常將把該調用傳遞給eval()。
    這麼講可能有些費解,這裏舉幾個例子:
    • <script type="text/javascript">
      eval("x=10;y=20;document.write(x*y)");//輸出200
      document.write(eval("2+2"));                 //輸出4
      var x=10
      document.write(eval(x+17));                  //輸出27
      </script>
    • var operator = "+";
      var num1 = 12;
      var num2 = 12;
      window.alert(eval(num1+eval("operator")+num2))://輸出24
      解釋一下這段程序:裏面的eval執行後是“+”,然後num1+num2作爲字符串傳給外層eval,結果爲24.
    • 說明:
      1. 動態判斷源代碼中的字符串是一種很強大的語言特性,幾乎沒有必要在實際中應用。如果你使用了eval(),你應當仔細考慮是否真的需要使用它。你完全可以用其他方法實現這些功能。
      2. 作爲參數的字符串必須是能夠單獨作爲語句在程序裏成功執行的,否則作爲參數毫無意義。而且還會拋出異常。也就是說,如果字符串作爲一個單獨的腳本是有語義的,那麼將其傳遞給eval作參數是完全沒有問題的,否則,eval會拋出語法錯誤異常。
  3. eval()的問題
    • eval方法是在運行時對腳本進行解釋執行,而普通的javascript會有一個預處理的過程。所以會有一些性能上的損失。但是這個倒是次要的。
    • eval()具有更改佈局變量的能力,這對於JavaScript優化器來說是一個很大的問題。
      具體說來是這樣:
      當腳本定義了eval的一個別名,且用另一個名稱調用它,JavaScript解釋器又會如何工作呢?爲了讓JavaScript解釋器的實現更加簡化,ECMAScript3標準規定了任何解釋器都不允許對eval賦予別名。如果eval函數通過別名調用的話,則會拋出一個EavlError異常。實際上,大多數的實現並不是這麼做的。當通過別名調用時,eval會將其字符串當成頂層的全局代碼來執行。執行的代碼可能會定義新的全局變量和全局函數,或者給全局變量賦值,但卻不能使用或者修改主調函數中的局部變量,因此,這不會影響到函數內的代碼優化。
  4. 幾點建議
    • eval並不常用,一般能用別的方法實現,可不選擇這種方法。
    • 當給eval傳參數的時候,首次按確定這個參數是字符串;其次,確定該字符串代表的語句單獨執行時是有意義的。
    • 不能將eval賦值給其他變量使用,即,不能用別的變量名稱來引用eval;在這,自己的變量名稱一定注意不要跟eval重複。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章