我有一个正常运行的应用程序脚本,但我有一些eval()语句才能使工作正常。我不太明白为什么“eval是邪恶的”,正如我一直在阅读,但我真正不明白的是如何避免使用它,因为它是我做它需要做的唯一事情。
在我的剧本中,我有一堆产品。每个产品都有自己的属性。还有一个包含所有数组名称的数组。当我运行不同的函数时,这些数组用于构建页面内容。我找到的唯一方法就是这样做:
var schedule = {};
$.each(productNameArray, function (i, name) {
schedule = eval(name);
// DO STUFF
});
简单地使用name传递字符串并且不读取它要引用的实际数组。 Eval使它成为一个对象。
那么如何在不使用eval()的情况下完成此任务?
答案 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 object
,cookies
,DOM
等。习惯间谍和发送数据。
关于为什么eval是邪恶的第二个重要主题是表现。 eval()
在实际解释ECMAscript代码时速度很慢。例如,使用setTimeout
之类的
setTimeout("myfunction();", 2000); // don't do that
这应该总是写成
setTimeout(myfunction, 2000);
让Javascript解析Javascript,对性能产生很大的影响。