eval函数是一种强大且易于动态生成代码的方法,那么有哪些需要注意的地方呢?
eval函数是一种强大且易于动态生成代码的方法,那么有哪些需要注意的地方呢?
不当地使用eval会使您的代码容易受到注入攻击。
调试可能更具挑战性(没有行号等)。
使用eval执行的代码运行速度较慢(无法编译/缓存eval的代码的机会)。
编辑:正如@Jeff Walden在评论中指出的那样,#3比2008年时不那么准确。然而,虽然一些已编译脚本的缓存可能会发生,但这仅限于重复执行且未经修改的脚本。更有可能的情况是,您每次都会eval一些经过轻微修改的脚本,因此无法缓存。让我们只说有些eval'd代码执行较慢。
eval并不总是有害的。有时候使用它是完全合适的。
然而,eval目前和历史上被那些不知道自己在做什么的人大量滥用。这包括撰写JavaScript教程的人,不幸的是,在某些情况下,这确实可能会带来安全后果——或者更常见的是简单的错误。因此,我们越能对eval提出质疑,就越好。每次使用eval都需要对自己所做的事情进行合理性检查,因为很有可能你可以用更好、更安全、更清洁的方式完成。
举一个典型的例子,要设置存储在变量“potato”中的元素的颜色:
eval('document.' + potato + '.style.color = "red"');
如果上面代码的作者对JavaScript对象如何工作的基础知识有所了解,他们就会意识到可以使用方括号代替字面点名称,从而避免使用eval的需要。document[potato].style.color = 'red';
…这样的写法更易读,同时潜在的漏洞也会减少。
(不过,真正知道该怎么做的人可能会说:
document.getElementById(potato).style.color = 'red';
这种方法比直接访问文档对象的DOM元素更加可靠。
JSON.parse()
而不是 eval()
。 - alexia我认为这是因为它可以从字符串执行任何JavaScript函数,并且使用它使人们更容易将恶意代码注入应用程序。
如果您正在传递 eval 用户输入,则通常只会出现问题。
有两点需要考虑:
安全性(但只要您自己生成要评估的字符串,这可能不是问题)
性能:在未知要执行的代码之前,无法进行优化。(关于 JavaScript 和性能,可以参考 Steve Yegge 的演示文稿《动态语言反击》)
eval
,然后,那段小代码片段在用户B的浏览器上运行时。 - Felipe Pereira将用户输入传递给eval()存在安全风险,而且每次调用eval()都会创建一个新的JavaScript解释器实例。这可能会消耗大量资源。
主要是,在维护和调试方面更加困难。就像使用goto
语句一样,它可以使用,但这会使问题更难以找到并且对可能需要稍后进行更改的人员更加困难。
需要记住的一件事是,你通常可以使用eval()在受限环境中执行代码 - 阻止特定JavaScript函数的社交网络网站有时可以通过在eval块中打破它们来欺骗它们 -
eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');
如果您想在可能不允许的地方运行一些JavaScript代码(Myspace,我在看你……),那么eval()可能是一个有用的技巧。
然而,出于上述所有原因,您不应该在自己可以完全控制的代码中使用它-这是不必要的,并且最好将其归类为“棘手的JavaScript黑客”货架。
除非您通过cgi或输入让eval()处理动态内容,否则它与页面中的所有其他JavaScript一样安全可靠。