有没有办法通过使用eval()来评估定义为字符串的函数?

时间:2018-03-13 17:15:44

标签: javascript function eval

我想将函数定义存储在字符串中,例如:

var funcString = 'function(){ return 4+4 }'

我可以使用eval()来评估函数吗?

例如:

var result = eval(funcString) 

将funcString中的字符串作为函数进行计算,并在结果中返回4 + 4(8)。

编辑:所以你从我告诉我的内容中了解到我不应该以这种方式使用eval,但对于我的情况,我不认为还有另一种方式。

我想在一个单独的文件中定义一组规则,我想指示我的Javascript库查看此文件并搜索规则。以下是规则的示例:

rule('logOut', (function() { return !JSLibrary.compareUserDetails })(), (function() { console.log("\n\nError: logged out user did not match\n\n\n") })())

我想评估规则中定义的两个函数,我认为eval是唯一的方法。我不知道是否还有其他人。

2 个答案:

答案 0 :(得分:1)

公平警告,eval is "evil."我会回答您的问题,但您可能需要重新考虑使用PerHourRate

在JavaScript中,函数是值,就像eval5'Stack Overflow'一样。事实上,document所做的是创建一个函数并将其抛入一个名为function myFunction(args) { body } *的变量中。

假设您想要使用该功能并将其放入另一个变量中。你可以说myFunction。如果你想调用该函数,你可以说var otherVariable = myFunction

但是假设您想要一个不与名称绑定的函数,例如,如果您将其传递给另一个函数。您可以使用匿名函数,定义为otherVariable()。这就是你所在的function(args) { body } - 字符串中的内容。匿名函数就像任何其他函数一样,您可以这样调用它们。实际上,您甚至可以在eval的结果中通过最后添加一些括号来调用它们。

不幸的是,它并不那么容易。您不能只使用匿名函数定义编写一行代码并期望它运行:您将收到一个错误,抱怨它没有被命名。要解决此问题,请在定义周围添加一些括号,以强制它为表达式而不是语句。

您的最终工作代码如下所示:

eval

当然,你不应该使用var funcString = '(function(){ return 4+4 })' var result = eval(funcString)() 来实现这一特定用途,但我希望你能从这个答案中学到一些关于JavaScript的知识。

*还有更多的东西,比如吊装,但这在解释中并不重要。

答案 1 :(得分:0)

使用immediately invoked function expression可以使用eval调用函数。



document.body.innerHTML = eval('(function(){return 4+4;})()');




警告:不要这样做:它不安全,性能杀手,难以阅读/理解等等