我正在编写一些JavaScript代码来解析用户输入的函数(用于类似Electron 表格的功能).解析了公式I could后,将其转换为JavaScript并在其上运行eval()
以生成结果.
然而,如果可以避免的话,我总是避免使用eval()
,因为它是邪恶的(而且,无论对错,我一直认为它在JavaScript中更邪恶,因为要计算的代码可能会被用户更改).
那么,什么时候可以使用它呢?
我正在编写一些JavaScript代码来解析用户输入的函数(用于类似Electron 表格的功能).解析了公式I could后,将其转换为JavaScript并在其上运行eval()
以生成结果.
然而,如果可以避免的话,我总是避免使用eval()
,因为它是邪恶的(而且,无论对错,我一直认为它在JavaScript中更邪恶,因为要计算的代码可能会被用户更改).
那么,什么时候可以使用它呢?
我想花点时间来回答你问题的前提——eval()是"evil".编程语言人员使用的"evil"一词通常意味着"危险",或者更准确地说是"用一个看起来很简单的命令就能造成很多伤害".那么,什么时候可以使用危险的东西呢?当你知道危险是什么,当你采取适当的预防措施时.
现在,让我们来看一下使用eval()的危险.和其他事情一样,可能存在许多小的隐患,但两大风险——eval()被视为邪恶的原因——是性能和代码注入.
关于你的具体案件.据我所知,您是自己生成字符串的,所以假设您小心地不允许生成"rm-rf某事-重要"这样的字符串,则不存在代码注入风险(但请记住,在一般情况下,代码注入风险为very very hard).此外,如果您在浏览器中运行,那么我认为代码注入是一个相当小的风险.
至于性能,您必须将其与编码的易用性进行权衡.我认为,如果要解析公式,最好在解析过程中计算结果,而不是运行另一个解析器(eval()中的解析器).但是,使用eval()编写代码可能会更容易,而且性能损失可能不会明显.在本例中,eval()似乎并不比任何其他可能为您节省时间的函数更邪恶.