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

use*_*267 7 javascript eval function tostring

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

var functionString = function (message) {
    console.log(message);
}.toString();
Run Code Online (Sandbox Code Playgroud)

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

eval(functionString)
Run Code Online (Sandbox Code Playgroud)

返回"Uncaught SyntaxError:Unexpected token",和

functionString.call(this, "HI!");
Run Code Online (Sandbox Code Playgroud)

返回'undefined不是函数'.

这甚至可以在JavaScript中?

在此先感谢您的回复!

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

console.log(functionString);
Run Code Online (Sandbox Code Playgroud)

返回此字符串:"function(message){console.log(message);}"

我可以将字符串转换回函数并调用它吗?这是我试图解决的问题.谢谢!

Ale*_*kka 2

functionString完全包含该字符串

"function (message) { console.log(message); }"

按原样评估它确实会导致 JavaScript 引擎语法不正确(该函数没有名称)。JavaScript 期望像function <name>(<params>) { }. 或者,您可以使用匿名函数(即不存在名称),但仅作为参数或在计算表达式的上下文中。最小的典型评估表达式是(function() {})()如果你想变得更奇特,!function() {}也可以 - 前面的感叹号将其转换为布尔表达式,需要在否定输出之前进行函数评估。

因此,在您的示例中,这将起作用:

eval("("+functionString+")('abc')");

因为这样你就可以进行匿名函数调用——这是 JavaScript 可以接受的。

或者,您也可以只使用括号,然后您需要将结果分配给稍后可以使用的内容:

var foo = eval("("+functionString+")");
foo('ddd');
Run Code Online (Sandbox Code Playgroud)

这里有一个小证明/游乐场来了解它: http ://jsfiddle.net/Exceeder/ydann6b3/