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

Is there a way to evaluate a function defined as a string by using eval()?

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

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

我可以使用 eval() 来计算函数吗?

例如:

var result = eval(funcString) 

这会将 funcString 中的字符串作为函数求值,结果为 return 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") })())

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

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

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

警告:永远不要这样做:它不安全,performance-killer,更难read/understand,等等

公平警告,eval is "evil." 不管怎样我都会回答你的问题,但你可能需要重新考虑使用 eval

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

的变量中

假设您想获取该函数并将其放入另一个变量。你可以直接说 var otherVariable = myFunction。如果你想调用那个函数,你可以说 otherVariable().

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

不幸的是,这并不容易。你不能只写一行带有匿名函数定义的代码并期望它是 运行:你会得到一个错误,抱怨它没有被命名。要解决此问题,请在定义周围加上一些括号以强制它成为表达式而不是语句。

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

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

当然,您永远不应该将 eval 用于此特定用途,但我希望您无论如何都能从这个答案中学到一些关于 JavaScript 的知识。

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