在JavaScript中使用eval()的主要好处是什么?

问题描述 投票:42回答:14

我知道这可能是一个新手问题,但我很好奇eval()的主要好处 - 哪里用得最好?我很感激任何信息。

javascript eval
14个回答
44
投票

最好使用eval函数:从不。

它的目的是将字符串计算为Javascript表达式。例:

eval('x = 42');

之前已经使用过很多,因为很多人不知道如何为他们想做的事情编写正确的代码。例如,为字段使用动态名称时:

eval('document.frm.'+frmName).value = text;

正确的方法是:

document.frm[frmName].value = text;

由于eval方法将字符串作为代码执行,因此每次使用它都是某人在页面中注入有害代码的可能开放。见cross-site scripting

eval函数有一些合法用途。但是,你可能不会遇到真正需要它的情况。


1
投票

基于表示javascript代码的字符串动态运行代码。例如:

let dynamicFunc = eval('(x)=>(x+2)') // or whatever plain text which is valid JS function
console.log(dynamicFunc(40));
// expected output: 42

安全警告!您应该始终验证这些字符串以避免恶意脚本执行,尤其是在服务器端使用它时。


0
投票

使用eval的最佳用例之一是javascript logger,用户可以在运行时执行javascript。例如javascript logger允许用户在记录器窗口中执行脚本。


0
投票

你可以构建一个客户端框架,让它作为基础应用程序工作 - 接收代码包然后执行它们 - 从而使客户端非常灵活 - 在服务器上捆绑所有代码。然而,这是非常危险的,如果需要这样的话,那么你应该使用Java和Java捆绑包。为什么Eval仍然在语言中是有争议的,使用它是一个太大的安全风险


0
投票

使用eval非常有用,但与其他所有内容一样,您必须意识到风险。每一堆JS代码都是潜在的风险。软件中的错误会因逻辑错误和编码错误而蔓延,从而产生意想不到的后果。我总是说计算机永远不会做你想要他们做的事情,他们做你告诉他们做的事情。这意味着你必须记住,必须仔细考虑软件。软件没有改变。人们仍然在动态编码,而不是仔细的analasys和适当的设计。我们都在软件开发中犯了同样的罪。使用eval - eval不是邪恶的,它就是你创造的。


-1
投票

Eval()可能非常有用,即使它被称为“撤消”。我在autoit中使用它来启用代码代码。

可以在编写代码处理器时应用它来创建自己的脚本。

为什么?在我的情况下,在大型tcp服务器上使用它不需要我重新编译源代码并踢掉所有客户端重启的原因。所以我使用eval来动态添加新脚本,这与配置内容不同,它不是静态的,可用于计算等。另外,eval与call命令的组合可以通过函数的eval设置一个值。

但除此之外,它使用起来并不安全。即使以这种方式使用它我也建议确保它安全无故障。


31
投票

这是一个相当古老的问题,也许人们当时没有正确考虑eval()的用例。 eval()的一个重要用途是在您的后端或前端开发流程中实现热重新加载。

基本上eval()可以让您在编辑器中编辑代码,并让它在不重新启动的情况下修补正在运行的应用程序,并且不会丢失状态(取决于实现)。您将需要监视文件更改的关联代码,并以某种方式将更改发送到您的应用程序,但eval()最终是将这些更改转换为实际js的方法。

编辑

我遇到的另一个用例:

你可以使用eval()绕过webpack的编译过程,在那些你想要动态需要你不想被编译的文件的事件中(比如json)例如:

const data = eval('require')(`./emails/${recipient}/${type}.json`)

在这方面,我认为写一个像eval()这样的陈述是邪恶的,或者永远不应该被使用是完全错误的。像这样的毯子声明是真正的邪恶!


10
投票

eval可以执行(或评估)一串javascript代码。

因此,当您希望某人执行一串javascript代码时,它是适用的。例如,在一篇关于JavaScript的教育文章中,所以读者可以立即尝试:)

或者,如果您的网站面向程序员,您可能希望他们编写并执行自己的插件。


7
投票

eval()不应该在Javascript中使用。

eval()曾用于解析JSON字符串,但这种使用已被更快,更安全的JSON.parse所取代。


6
投票

使用eval的最佳目标是动态加载代码,在运行时生成代码并执行类似的元编程。一般情况下,如果您可以在没有eval的情况下执行相同操作,请不要使用eval。


3
投票

您可以运行存储在网页上字段值中的JS。

你可以在eval中使用eval,这就是你的代码更容易攻击。只要它不使用AJAX,就没有服务器问题。

如果使用eval,则应解析字符[()<> {}]


3
投票

eval() = evil

你根本不应该使用它。它可以用于简单的代码插入,但有人可以使用eval()插入坏脚本。有时人们使用eval()来解析JSON,或者

eval("obj." + id);   //newbies

但实际上你可以在不使用eval()的情况下实现所有这些目标。

obj[id];             //should-do

2
投票

如前所述,使用eval()时存在潜在风险,如果要将字符串评估为表达式,可以使用$ {}来评估ECMA-6中引入的表达式


1
投票

也许我错了,但我用它将经典字符串(从文件)转换为ES6模板字符串:

let name = 'Daman'
let classicString = 'Hello ${name}'
let templateString = eval('`' + classicString + '`')

这给了我我需要的东西:

"Hello Daman"
© www.soinside.com 2019 - 2024. All rights reserved.