如何从字符串中调用匿名函数

6

我有一个包含匿名函数定义的字符串,但是我该如何调用它呢?比如说函数如下:

var fn_str = "function(){ alert('called'); }";

尝试使用eval,但出现了一个错误,提示函数必须有一个名称。
eval(fn_str).apply(this); // SyntaxError: function statement requires a name

当函数字符串在fn_str中时,您使用eval调用a是行不通的。 - gdoron
抱歉,我在 Firebug 控制台中使用了“a”作为缩写,但忘记更改它了。不过你的眼力真好。 - Kristian
3个回答

8

您可以使用 立即调用函数表达式

var fn_str = "function(){ alert('called'); }";
eval('(' + fn_str +')();');

立即执行函数表达式

另一种方法是使用 Function 对象(如果您有函数体字符串):

var func = new Function("alert('called')");
func.apply(this);

1
已经解决了,但还是谢谢!接受/+1 快速回复 :) - Kristian

3

1
找到了解决方案:将函数放在括号中。
var a = "(function(){ alert('called'); })";
eval(a).apply(this);

1
你无需编写使用apply,你可以像我回答的那样使用“立即调用函数表达式”。 - gdoron
我知道那个语法,但是我不能这样将一个对象作为参数传递(而不将对象解析为字符串)。或者我可以吗? - Kristian
你在那个评论中的意思是什么,我没听懂。你需要什么? - gdoron
示例代码:var fn = "function(object, cb) { /* 对对象进行操作 */ }"; var obj = { param: value, param2: value2 }; eval('('+fn')').apply(this, [obj]); - Kristian
你能获取函数体吗?不包括 function(object, cb){ 部分。 - gdoron
我可以解析字符串并从中删除 function(){},但是我已经解决了我的问题。无论如何,谢谢。 - Kristian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接