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

Cof*_*fee 46 javascript eval

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

Guf*_*ffa 44

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

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

eval('x = 42');
Run Code Online (Sandbox Code Playgroud)

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

eval('document.frm.'+frmName).value = text;
Run Code Online (Sandbox Code Playgroud)

正确的方法是:

document.frm[frmName].value = text;
Run Code Online (Sandbox Code Playgroud)

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

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


Mat*_*Way 34

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

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

编辑

我遇到的另一个用例:

您可以eval()在想要动态需要不需要编译的文件的事件中绕过webpack的编译过程(例如json)例如:

const data = eval('require')(`./emails/${recipient}/${type}.json`)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我遇到的最好和真实的用例。(y) (2认同)
  • 在所有答案中,这是唯一一个具有实际内容的答案。**有有效的用例,**哪些用例?**永远不要使用它!** 为什么 `eval` 存在?很好的答案! (2认同)

Imp*_*Imp 10

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

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

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


SLa*_*aks 7

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

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

  • @Guffa:是的,但不应该. (3认同)

Kon*_*tov 6

使用eval的最佳目标是动态加载代码,在运行时生成代码并执行类似的元编程工作。通常,如果无需eval就可以执行相同操作,请不要使用eval。