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);}"
我可以将字符串转换回函数并调用它吗?这是我试图解决的问题.谢谢!
您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/