We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
转自知乎 王欣彤 的 回答。
不推荐使用 eval 的原因有很多,
eval
1、eval 太神秘了,以至于很多人用错。所以不推荐使用。
比如这段代码你应该见过:
function isChecked(optionNumber) { return eval("forms[0].option" + optionNumber + ".checked"); } var result = isChecked(1);
然而实际上,我们可以这样写:
function isChecked(optionNumber) { return forms[0]["option" + optionNumber].checked; } var result = isChecked(1);
这并不是 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> 标签,或者一段来历不明的 JSON-P 请求,再或者就是Ajax请求中的 eval 代码。
<script>
所以啊,只要你的信息源不安全,你的代码就不安全。不单单是因为 eval 引起的。
你用 eval 的时候会在意XSS的问题,你越在意就越出问题,出的多了,eval 就成噩梦了。
5、效率问题是程序逻辑问题。对于一些有执行字符串代码需求的程序中,不用 eval 而用其他方式模拟反而会带来更大的开销。
附上几篇文章:
eval 是魔鬼:JavaScript探秘:eval() 是“魔鬼” -- 简明现代魔法
eval 不是魔鬼:eval() isn’t evil, just misunderstood eval
到底是不是魔鬼,看看再做决定吧~
哦,看到一些说 json.parse 内部是用 eval 的,再附上几个链接供大家参考。 javascript - Does JSON.parse() use eval() internally?
json.parse 源码:https://code.google.com/p/v8/source/browse/trunk/src/json-parser.h
json.parse
The text was updated successfully, but these errors were encountered:
No branches or pull requests
转自知乎 王欣彤 的 回答。
不推荐使用
eval
的原因有很多,1、
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>
标签,或者一段来历不明的 JSON-P 请求,再或者就是Ajax请求中的eval
代码。所以啊,只要你的信息源不安全,你的代码就不安全。不单单是因为
eval
引起的。你用
eval
的时候会在意XSS的问题,你越在意就越出问题,出的多了,eval
就成噩梦了。5、效率问题是程序逻辑问题。对于一些有执行字符串代码需求的程序中,不用
eval
而用其他方式模拟反而会带来更大的开销。附上几篇文章:
eval
是魔鬼:JavaScript探秘:eval() 是“魔鬼” -- 简明现代魔法eval
不是魔鬼:eval() isn’t evil, just misunderstoodeval
到底是不是魔鬼,看看再做决定吧~
哦,看到一些说 json.parse 内部是用
eval
的,再附上几个链接供大家参考。javascript - Does JSON.parse() use eval() internally?
json.parse
源码:https://code.google.com/p/v8/source/browse/trunk/src/json-parser.hThe text was updated successfully, but these errors were encountered: