Javascript是一门解释型语言,与其它同类型语言一样,他拥有功能强大的eval()函数。eval()能把字符串当作普通的javascript代码一样执行。它非常强大且易用,以至于被用在了许多不该使用的地方,让代码执行变慢以及难以维护。一般来讲,如果你使用了eval,你的设计上可能就有问题。
这是一个典型的误用eval()的例子。你有一个名为foo的javascript对象,你要访问他的属性,但是只有在运行的时候才知道他的属性名。别像下面这样做。
var property = 'bar';
var value = eval('foo.' + property);
没错,他可以运行。但是每次在执行这段代码的时候,javascript都会返回到解释模式下,这会让你的程序变慢。这样的做法也相当的丑陋。
正确的做法应该像这样:
var property = 'bar';
var value = foo[property];
在javascript里,方括号可以像.运算符那样用作查找。唯一的不同是方括号里要用字符串。
安全问题
在所有的编程语言里,你对执行不受信任的代码都要引起高度的警惕。Javascript也是如此,你在使用eval()执行那此可能会被篡改的代码时要小心。比如,这段要执行的代码来自页面查询的字符串。执行这样的不受信任的代码将使你很容易受到跨站脚本攻击。
那它有什么好?
一些程序员说eval()是B.A.D(Broken As Designed),应该从javascript里去掉。可是,在一些场合下它可以显著地简化你的代码。一个例子就是与XMLHttpRequest配合使用。XMLHttpRequest让你可以在不刷新整个页面的情况下,在javascript里回调服务器。一个简单方法就是把服务器返回的javascript代码作为参数传给eval()。以下是一个简单的例子:使用XMLHttpRequest和eval()载入并解析javascript。
function evalRequest(url) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
eval(xmlhttp.responseText);
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}