将函数调用为字符串

时间:2013-06-03 11:08:37

标签: javascript

我的字符串是我的javaScript函数:

var foo = "CONCATENATE('a', ' ', 'b')";

如何在不使用eval()的情况下对此函数进行javaScript调用?

2 个答案:

答案 0 :(得分:2)

:)这是一个有趣的问题。让我一步一步完成这一步。这将无法处理所有内容,只能处理带字符串参数的函数。

这是一个jsFiddle,其中包含一些基本代码:http://jsfiddle.net/Sqa8L/

请注意,我根本没有测试过,所以要特别小心使用。

步骤1:使用正则表达式获取函数名称

理想情况下,我建议使用某种解析器来获得更可靠的结果,但我认为一旦理解了一般概念,就可以完成这个答案。所以,正则表达式首先:

var matchFnName = /^([^(]+)\(([^)]+)\)/.exec(str);

这将为您提供两个匹配项,一个用于函数名称,第二个用于整个参数列表。 (除非你有复杂的表达式,在这种情况下,它会失败:))。

提取参数

我刚刚使用简单的声明进行拆分:

var paramList = paramListStr.split(',');

如果任何字符串包含',',则会失败。您需要一种更好的解析技术来处理这个问题。

在对象上调用该函数

您需要发送一个响应函数调用的对象,或者默认为全局范围。

onObject[fnName].apply(onObject, paramList);

看看申请here。基本上,apply所做的是在第一个参数onObject中提供的对象上调用函数,并在第二个参数paramList中传递参数列表。

希望这有助于让您从大方向开始。

答案 1 :(得分:1)

无论您使用哪种解决方案,它都会在javascript级别隐式或显式调用eval(),或者在引擎级别上等效。