如果我将函数放入这样的字符串中:
var functionString = function (message) {
console.log(message);
}.toString();
有没有办法将字符串转换回函数并调用它? 我试过了
eval(functionString)
返回" Uncaught SyntaxError:意外的令牌"和
functionString.call(this, "HI!");
返回' undefined不是函数'。
甚至可以在javascript中使用吗?
预先感谢您的回复!
编辑:这个问题的关键是函数已经使用toString()转换为字符串。所以
console.log(functionString);
返回此字符串: "功能(消息){console.log(消息);}"
我可以将字符串转换回函数并调用它吗?这就是我想要解决的问题。 谢谢!
答案 0 :(得分:3)
你快到了,但是你错过了什么。
当我们在你的函数上调用toString()时,我们得到
"function (message) {
console.log(message);
}"
然后我们可以评估。但是,我们只是在这里创建一个匿名函数对象;我们无法打电话给它!
如果我们改为:
var functionString = "var restoredFunc = " + function (message) {
console.log(message);
}.toString();
然后我们可以执行以下操作
eval(functionString);
// prints "hello!" to console
restoredFunc("hello!");
答案 1 :(得分:2)
您的functionString
包含字符串
"function (message) { console.log(message); }"
按原样评估它确实为JavaScript引擎提供了错误的语法(此函数没有名称)。 JavaScript需要像function <name>(<params>) { }
这样的构造。或者,您可以使用匿名函数(即不存在名称),但仅作为参数或在评估表达式的上下文中使用。最小的典型评估表达式是(function() {})()
如果你想得到花哨,!function() {}
也可以 - 前面的感叹号将它变成布尔表达式,需要在否定输出之前进行函数求值。
因此,在您的示例中,这将起作用:
eval("("+functionString+")('abc')");
因为那时你会进行匿名函数调用 - 这是JavaScript可以使用的东西。
或者,你也可以只使用括号,然后你需要将结果分配给以后可以使用的东西:
var foo = eval("("+functionString+")");
foo('ddd');
这是一个了解它的小证明/游乐场: http://jsfiddle.net/Exceeder/ydann6b3/
答案 2 :(得分:1)
是的,它可以在JavaScript中使用但你可以eval
匿名函数而无需赋值
所以你就这样经历了
var functionString = function (message) {
console.log(message);
}.toString();
eval("myfunction =" + functionString)
myfunction("Hello World!")
答案 3 :(得分:1)
您的functionString
是一个类似于
"function (message) {
console.log(message);
}"
您可以使用字符串连接将该字符串转换为立即调用的函数表达式(IIFE),类似于下面。
(function (message) {
console.log(message);
})("HI!");
然后评估那个。以下是Chrome的JavaScript控制台的结果:
eval('(' + functionString + ')("HI!")')
HI!