1. 程式人生 > >關於JS中的eval()函式問題

關於JS中的eval()函式問題

今天練習ajax時,用到了eval()函式【ajax返回的文字字串】,但相關知識點已記不太清楚了,於是就去查詢相關資料,做了以下整理。
    1:eval()是什麼?
          eval()方法就像是一個完整的ECMAScript解析器,即要執行的ECMAScript(或JavaScript)的自符串的解析器。
          Eg:

     eval("alert(11)")
     //等價於
     alert(11);
   2:eval()在函式中的字串解析規則
         解析器發現程式碼中呼叫 eval() 方法時,它會將傳入的引數當作實際的 ECMAScript 語句來解析,然後把執行結果插入到原位置。通過eval() 執行的程式碼被認為是包含該次 調    用的執行環境的一部分,因此被執行的程式碼具有與該執行環境相同的作用域鏈。
        Eg:
    eval("function sayHi() { alert('hi'); }");
    sayHi();
   3:使用eval()函式的注意事項
       在 eval() 中建立的任何變數或函式都不會被提升,因為在解析程式碼的時候,它們被包含在一個字串中;它們只在eval() 執行的時候建立。嚴格模式下,在外部訪問不到          eval() 中建立的任何變數或函式,因此前面兩個例子都會導致錯誤。
      同樣,在嚴格模式下,為 eval 賦值也會導錯誤。
   4:eval()函式的缺點
       4.1. eval 不容易除錯
             在 chromeDev 等環境下,在 eval 處是不能打斷點的;
       4.2. eval 的效能低
             現代瀏覽器中有兩種編譯模式:fast path 和 slow path,fast path 是編譯那些穩定且可預測的程式碼,而 eval 明顯是不可預測,所以編譯的時間會很慢。
      4.3. 安全問題:

              這也是我覺得最主要的原因,eval 在處理不確定字串的時候,會引起 XSS(跨站指令碼攻擊)。而且不光是eval,其他方式也可能引起安全問題。比如:莫名其妙給你   注入一個<script src="">標籤,或者一段來歷不明的JSON-P請求,再或者就是Ajax請求中的eval程式碼…所以啊,只要你的資訊源不安全,你的程式碼就不安全。不單單是因為eval 引起的。
    綜合以上來說,儘量少在函式中使用eval()函式,特別是在不知道一些資料來源時儘量不使用。
    如有錯誤地方,歡迎大家指正交流,共同進步。