关于javascript中的eval()的问题...为什么它是邪恶的,如何在不使用它的情况下完成同样的事情?

时间:2010-08-11 12:34:52

标签: javascript jquery eval

我有一个正常运行的应用程序脚本,但我有一些eval()语句才能使工作正常。我不太明白为什么“eval是邪恶的”,正如我一直在阅读,但我真正不明白的是如何避免使用它,因为它是我做它需要做的唯一事情。

在我的剧本中,我有一堆产品。每个产品都有自己的属性。还有一个包含所有数组名称的数组。当我运行不同的函数时,这些数组用于构建页面内容。我找到的唯一方法就是这样做:

var schedule = {};  
$.each(productNameArray, function (i, name) {
    schedule = eval(name);
    // DO STUFF
});

简单地使用name传递字符串并且不读取它要引用的实际数组。 Eval使它成为一个对象。

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

2 个答案:

答案 0 :(得分:1)

Eval Evil。

Eval是邪恶的,因为eval'd代码无法通过javascript解释器和minifiers进行优化,这可能会导致相当多的问题(也许解释器或minifier理解它错误,或者由于转换填充了eval')范围)。硬币的另一面是通常99%的eval'd代码可以被重写为不使用eval - 它可能需要大量的思考和解决问题,但通常情况就是这样。

如何避免使用它。

  

我真正不明白的是如何避免使用它,因为它是我做它需要做的唯一事情。

     

简单地使用name传递字符串并且不读取它要引用的实际数组。 Eval使它成为一个对象。

您可以使用对象存储要引用的变量,然后使用obj[name]。然而,如果没有完整的代码,这只是一个推测......这似乎是合适的。

答案 1 :(得分:1)

您正在做的是解析JSON(如)字符串。这是少数情况之一,其中eval实际上不是evil

如果您可以信任服务器100%来自客户端的数据,那么这根本不是一个真正的问题(与eval讨论安全问题)。

如果不是这种情况,您始终应该避免使用eval(),因为评估的任何代码都可以访问您的global window objectcookiesDOM等。习惯间谍和发送数据。

关于为什么eval是邪恶的第二个重要主题是表现。 eval()在实际解释ECMAscript代码时速度很慢。例如,使用setTimeout之类的

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

这应该总是写成

setTimeout(myfunction, 2000);

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