JavaScript中关于eval()的问题...为什么它被认为是邪恶的,我如何在不使用它的情况下完成相同的功能?

3
我有一个应用程序脚本,它能正常工作,但是我使用了一些eval()语句来使其正常运行。我不太明白为什么"eval is evil"(eval是邪恶的),因为我一直在阅读这个话题,但我真正不理解的是当它是我所需要的唯一方法时,如何避免使用它。
在我的脚本中,我有很多产品。每个产品都有自己的属性数组。还有一个包含所有数组名称的数组。当我运行不同的函数时,这些数组被用于构建页面内容。我发现唯一可行的方法是这样做:
var schedule = {};  
$.each(productNameArray, function (i, name) {
    schedule = eval(name);
    // DO STUFF
});

使用name只传递一个字符串,没有实际读取它要引用的数组。eval使其作为对象工作。

那么如何在不使用eval()的情况下完成这个任务呢?


你可以写一个关于“名字”内容的例子。 - andres descalzo
2个回答

1

你正在解析一个类似JSON的字符串。这是为数不多的几种情况之一,eval实际上并不是evil

如果您可以百分之百信任从服务器传输数据到客户端的数据,那么这实际上不是一个真正的问题(谈论使用eval时的安全问题)。

如果不是这种情况,您应该始终避免使用eval(),因为任何被评估的代码都可以访问您的全局窗口对象cookiesDOM等,并用于监视和发送数据。

关于为什么eval是有害的第二个重要话题是性能。当涉及到实际解释ECMAscript代码时,eval()速度很慢。例如,使用setTimeout

setTimeout("myfunction();", 2000); // don't do that

这个应该总是像这样写

setTimeout(myfunction, 2000);

让Javascript解析Javascript会对性能产生很大的影响。


服务器响应被伪造的一种方法是修改本地hosts文件。你永远不能相信你所接收到的内容。 - balupton
@balupton:听起来相当牵强。如果有人可以访问您的本地计算机,他不会试图获取您的浏览器JavaScript,而是要获取您的内核模式/木马/其他内容。 - jAndy
我会继续使用现有的方法,因为它确实有效,但下次我会考虑采用更面向对象的方法。感谢您的建议。 - Duffy Dolan

1

Eval的邪恶。

Eval是邪恶的,因为eval的代码无法被JavaScript解释器和缩小器优化,这可能会导致很多问题(也许解释器或缩小器理解错误,或由于转换出现了问题)。另一方面,通常99%的eval代码可以重写以不使用eval - 这可能需要大量思考和问题解决,但通常情况下是这样的。

如何避免使用它。

我真正不理解的是,当它是唯一能做到我需要的事情时,如何避免使用它。

仅使用名称传递字符串,并未读取其所需引用的实际数组。Eval使其作为对象工作。

您可以使用对象来存储要引用的变量,然后使用obj [name]。但是,没有完整的代码,这只是一种猜测...应该是合适的。


我一开始应该构建对象而不是使用数组和字符串。我必须在2.0版中重新设计它。谢谢。 - Duffy Dolan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接