51

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

4

15 回答 15

45

eval最好使用该功能:从不。

它的目的是将字符串评估为 Javascript 表达式。例子:

eval('x = 42');

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

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

正确的方法是:

document.frm[frmName].value = text;

由于该eval方法将字符串作为代码执行,因此每次使用它都有可能让某人在页面中注入有害代码。请参阅跨站点脚本

该功能有一些合法用途eval。但是,您不太可能处于实际需要它的情况。

于 2012-05-06T21:22:14.327 回答
43

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

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

编辑

我遇到的另一个用例:

您可以eval()在您想要动态要求您不想被转译的文件(如 json)的事件中使用绕过 webpack 的编译过程,例如:

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

在那一点上,我认为写一个像是eval()邪恶的陈述是完全错误的,或者永远不应该使用。像这样的笼统陈述才是真正的邪恶!

于 2016-05-13T06:31:59.963 回答
11

eval使得执行(或评估)一串javascript代码成为可能。

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

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

于 2012-05-06T21:12:24.760 回答
7

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

于 2013-02-05T21:20:54.273 回答
6

eval()不应在 Javascript 中使用。

eval()曾经用于解析 JSON 字符串,但这种用法已被更快、更安全的JSON.parse.

于 2012-05-06T21:07:41.513 回答
4

                  eval() = evil

你根本不应该真正使用它。它可用于轻松插入代码,但有人可以使用eval(). 有时人们eval()用于解析 JSON,或者

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

但实际上你可以在不使用eval().

obj[id];             //should-do
于 2012-05-06T21:10:30.980 回答
3

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

您可以将 eval 与 JS 一起使用,只是这样您的代码更容易受到攻击。只要不使用AJAX,就没有服务器问题。

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

于 2012-05-06T21:08:18.223 回答
1

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

于 2015-01-28T11:47:12.647 回答
1

也许我错了,但我用它来解析模板文件中的字符串:

const name = 'Daman'
const fileContent = 'Hello ${name}'
const result = eval('`' + fileContent + '`')

这给了我我需要的东西:

"Hello Daman"
于 2016-09-15T15:03:53.137 回答
0

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

于 2014-04-12T04:11:55.833 回答
0

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

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

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

于 2019-05-12T17:26:28.390 回答
-1

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

于 2014-11-11T08:28:41.143 回答
-1

永远不要把话说绝了。Eval 有很好的合法用例。它只是一个强大的工具,所以如果你不认真地使用它,你可能会产生一个严重的问题。

由于 Javascript 是在客户端执行的,因此安全风险在于客户端而不是服务器。如果您在 javascript 中使用 eval 并且您不小心验证输入源或 eval 函数的输入内容,您将对客户端潜在的严重后果负责。

话虽如此,我对 javascript eval 的最佳使用是在编写各种类型的解析例程时。例如,将简单(或有时不那么简单)的数学公式作为存储在数据库中的字符串放入数据中通常很方便。如果您的程序需要对程序控制的变量执行任意计算,那么 eval 是最好的方法。手动解析安全管理的字符串可能会变得不必要的复杂。

作为开发人员,我们无法完全控制客户端发生的事情。用户总是可以在控制台中捣乱并创建自己的问题,或者下载干扰 JS 执行的浏览器扩展。我们能做的最好的事情就是限制风险敞口,而不是疏忽大意以至于留下巨大的安全漏洞。

于 2019-12-17T20:42:28.783 回答
-1

使用 eval 很有用,但与其他一切一样,您必须意识到风险。每一段 JS 代码都是潜在的风险。软件中的错误会通过逻辑错误和编码错误潜入,并带来意想不到的后果。我总是说计算机永远不会做你想让他们做的事情,他们会做你告诉他们做的事情。这意味着您必须记住,必须仔细考虑软件。软件没变。人们仍然在动态编码,而不是仔细分析和适当的设计。在软件开发中,我们都犯了同样的罪。使用 eval - eval 不是邪恶的,它是你所做的。

于 2019-05-04T11:55:25.657 回答
-2

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

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

为什么?在我的情况下,在大型 tcp 服务器上使用它不需要我重新编译源代码并踢掉所有客户端导致重新启动。因此,我使用 eval 动态添加新脚本,这与配置文件不同,它不是静态的,可用于计算等。还将 eval 与调用命令结合起来可以通过函数的 eval 设置值。

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

于 2019-03-29T20:07:15.073 回答