有没有办法通过使用 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 的知识。
* 还有更多的东西,比如提升,但这在这个解释中并不重要。
我想将函数定义存储在字符串中,例如:
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 的知识。
* 还有更多的东西,比如提升,但这在这个解释中并不重要。