關於JS中的eval()函式問題
阿新 • • 發佈:2019-01-01
今天練習ajax時,用到了eval()函式【ajax返回的文字字串】,但相關知識點已記不太清楚了,於是就去查詢相關資料,做了以下整理。
1:eval()是什麼?
eval()方法就像是一個完整的ECMAScript解析器,即要執行的ECMAScript(或JavaScript)的自符串的解析器。
Eg:
eval("alert(11)")
//等價於
alert(11);
2:eval()在函式中的字串解析規則解析器發現程式碼中呼叫 eval() 方法時,它會將傳入的引數當作實際的 ECMAScript 語句來解析,然後把執行結果插入到原位置。通過eval() 執行的程式碼被認為是包含該次 調 用的執行環境的一部分,因此被執行的程式碼具有與該執行環境相同的作用域鏈。
Eg:
3:使用eval()函式的注意事項eval("function sayHi() { alert('hi'); }"); sayHi();
在 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()函式,特別是在不知道一些資料來源時儘量不使用。
如有錯誤地方,歡迎大家指正交流,共同進步。