天天看點

JavaScript 為什麼不推薦使用 eval?

作者:王欣彤

連結:http://www.zhihu.com/question/20591877/answer/57705130

來源:知乎

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

不推薦使用eval的原因有很多,

1、eval 太神秘了,以至于很多人用錯。是以不推薦使用。

比如這段代碼你應該見過:

<img src="https://pic4.zhimg.com/bf68046fed17de9b1e195e3d7fcb247f_b.png" data-rawwidth="632" data-rawheight="136" class="origin_image zh-lightbox-thumb" width="632" data-original="https://pic4.zhimg.com/bf68046fed17de9b1e195e3d7fcb247f_r.png">

JavaScript 為什麼不推薦使用 eval?

然而實際上,我們可以這樣寫:

<img src="https://pic4.zhimg.com/0d2bb9e0fbb2e206fdf707ac20b9b943_b.png" data-rawwidth="642" data-rawheight="132" class="origin_image zh-lightbox-thumb" width="642" data-original="https://pic4.zhimg.com/0d2bb9e0fbb2e206fdf707ac20b9b943_r.png">這并不是eval 不好而是因為容易被用錯。

JavaScript 為什麼不推薦使用 eval?

這并不是eval 不好而是因為容易被用錯。

eval隻是一個普通的函數,隻不過他有一個快速通道通向編譯器,可以将string變成可執行的代碼。有類似功能的還有Function , setInterval 和 setTimeout。

2、 eval不容易調試。用chromeDev等調試工具無法打斷點調試,是以麻煩的東西也是不推薦使用的…

3、說到性能問題,在舊的浏覽器中如果你使用了eval,性能會下降10倍。在現代浏覽器中有兩種編譯模式:fast path和slow path。fast path是編譯那些穩定和可預測(stable and predictable)的代碼。而明顯的,eval不可預測,是以将會使用slow path ,是以會慢。

還有一個是,在使用類似于Closure Compiler等壓縮(混淆)代碼時,使用eval會報錯。

(又慢又報錯,我還推薦嗎?)

4、關于安全性,我們經常聽到eval是魔鬼,他會引起XSS攻擊,實際上,如果我們對資訊源有足夠的把握時,eval并不會引起很大的安全問題。而且不光是eval,其他方式也可能引起安全問題。比如:

莫名其妙給你注入一個<script src="">标簽,或者一段來曆不明的JSON-P請求,再或者就是Ajax請求中的eval代碼… 是以啊,隻要你的資訊源不安全,你的代碼就不安全。不單單是因為eval引起的。

你用eval的時候會在意XSS的問題,你越在意就越出問題,出的多了,eval就成噩夢了。

5、效率問題是程式邏輯問題。對于一些有執行字元串代碼需求的程式中,不用eval而用其他方式模拟反而會帶來更大的開銷。

作者:王欣彤

連結:http://www.zhihu.com/question/20591877/answer/57705130

來源:知乎

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

http://www.zhihu.com/question/20591877

轉載于:https://www.cnblogs.com/ron123/p/5563624.html

繼續閱讀