0

我有一个字符串是我的 javaScript 函数:

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

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

4

2 回答 2

2

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

这是一个带有一些基本代码的 jsFiddle:http: //jsfiddle.net/Sqa8L/

请注意,我根本没有对其进行测试,因此请谨慎使用。

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

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

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

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

提取参数

我刚刚使用简单的语句进行了拆分:

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

如果任何字符串包含“,”,这将失败。您将需要更好的解析技术来处理这个问题。

在对象上调用函数

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

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

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

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

于 2013-06-03T11:28:41.180 回答
1

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

于 2013-06-03T11:14:11.047 回答