Skip to content
New issue

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

为什么 Javascript 不推荐使用 eval()? #8

Open
JasinYip opened this issue Aug 4, 2015 · 0 comments
Open

为什么 Javascript 不推荐使用 eval()? #8

JasinYip opened this issue Aug 4, 2015 · 0 comments
Labels

Comments

@JasinYip
Copy link

JasinYip commented Aug 4, 2015

转自知乎 王欣彤回答


不推荐使用 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 代码。

所以啊,只要你的信息源不安全,你的代码就不安全。不单单是因为 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

@JasinYip JasinYip added the 前端 label Aug 4, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant