Javascript 有没有办法使用eval()对定义为字符串的函数求值?

Javascript 有没有办法使用eval()对定义为字符串的函数求值?,javascript,function,eval,Javascript,Function,Eval,我希望将函数定义存储在字符串中,例如: var funcString = 'function(){ return 4+4 }' var result = eval(funcString) 我可以使用eval()对函数求值吗 例如: var funcString = 'function(){ return 4+4 }' var result = eval(funcString) 它将funcString中的字符串作为函数进行求值,并在结果中返回4+4(8) 编辑:所以从你告诉我的,我明

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

var funcString = 'function(){ return 4+4 }'
var result = eval(funcString) 
我可以使用eval()对函数求值吗

例如:

var funcString = 'function(){ return 4+4 }'
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是唯一的方法。我不知道是否还存在其他函数。

使用函数可以通过eval调用函数。
document.body.innerHTML=eval('(function(){return 4+4;})(')使用带有eval的can调用函数。
document.body.innerHTML=eval('(function(){return 4+4;})(')公平警告,不管怎样,我都会回答您的问题,但您可能需要重新考虑使用
eval

在JavaScript中,函数是值,就像
5
“堆栈溢出”
文档
。事实上,
function myFunction(args){body}
所做的就是创建一个函数,并将其放入名为
myFunction
*的变量中

假设你想把这个函数放到另一个变量中。您可以说
var otherVariable=myFunction
。如果你想调用这个函数,你可以说
otherVariable()

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

不幸的是,这并不是那么容易。您不能只编写一行带有匿名函数定义的代码并期望它运行:相反,您会收到一个错误,抱怨它没有命名。若要解决此问题,请在定义周围加上一些括号,使其成为表达式而不是语句

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

var funcString = '(function(){ return 4+4 })'
var result = eval(funcString)()
当然,对于这个特殊的用途,您永远不应该使用
eval
,但我希望您从这个答案中了解一些JavaScript

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

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

在JavaScript中,函数是值,就像
5
“堆栈溢出”
文档
。事实上,
function myFunction(args){body}
所做的就是创建一个函数,并将其放入名为
myFunction
*的变量中

假设你想把这个函数放到另一个变量中。您可以说
var otherVariable=myFunction
。如果你想调用这个函数,你可以说
otherVariable()

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

不幸的是,这并不是那么容易。您不能只编写一行带有匿名函数定义的代码并期望它运行:相反,您会收到一个错误,抱怨它没有命名。若要解决此问题,请在定义周围加上一些括号,使其成为表达式而不是语句

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

var funcString = '(function(){ return 4+4 })'
var result = eval(funcString)()
当然,对于这个特殊的用途,您永远不应该使用
eval
,但我希望您从这个答案中了解一些JavaScript


*除此之外还有很多,比如起重,但这在这个解释中并不重要。

仔细思考你为什么要这样做,因为这是一个可怕的想法,几乎每一个可以想象的指标。另外,
let八=新函数('return 4+4;')()。也很糟糕。该函数被添加到顶级作用域中,而您没有给它命名。永远不要使用eval。这是一种可怕的做法。当然,可能会有一些罕见的情况,这被认为是可以接受的,但我认为它们不适用。是的,很抱歉,我以前没有注意到。我将编辑我的问题,以提供我真正想要的。请非常、非常仔细地思考您为什么要这样做,因为这是一个可怕的想法,几乎每一个可以想象的指标。另外,
let八=新函数('return 4+4;')()。也很糟糕。该函数被添加到顶级作用域中,而您没有给它命名。永远不要使用eval。这是一种可怕的做法。当然,可能会有一些罕见的情况,这被认为是可以接受的,但我认为它们不适用。是的,很抱歉,我以前没有注意到。我将编辑我的问题,以提供我真正想要的。虽然答案正确,但可以通过警告永远不要这样做来改进答案:它不安全,性能杀手,更难阅读/理解,等等。如果答案正确,可以通过警告永远不要这样做来改进答案:它不安全,性能杀手,更难阅读/理解,等等,你测试过这个吗<代码>变量funcString='函数(){返回4+4