调用以字符串编码的javascript函数

时间:2014-12-05 21:09:05

标签: javascript function eval tostring

如果我将函数放入这样的字符串中:

var functionString = function (message) {
    console.log(message);
}.toString();

有没有办法将字符串转换回函数并调用它? 我试过了

eval(functionString)

返回" Uncaught SyntaxError:意外的令牌"和

functionString.call(this, "HI!");

返回' undefined不是函数'。

甚至可以在javascript中使用吗?

预先感谢您的回复!

编辑:这个问题的关键是函数已经使用toString()转换为字符串。所以

console.log(functionString);

返回此字符串: "功能(消息){console.log(消息);}"

我可以将字符串转换回函数并调用它吗?这就是我想要解决的问题。 谢谢!

4 个答案:

答案 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!