Javascript 以字符串形式调用函数

Javascript 以字符串形式调用函数,javascript,Javascript,我有一个字符串,它是我的javaScript函数: var foo = "CONCATENATE('a', ' ', 'b')"; 如何在不使用eval()的情况下进行此函数的javaScript调用?无论使用哪种解决方案,它都会在javaScript级别隐式或显式调用eval(),或者在引擎级别显式调用它的等效函数。无论使用哪种解决方案,它都会隐式或显式调用eval()在javascript级别,或者它在引擎级别是等效的。:)这是一个有趣的问题。让我一步一步地讲。这将不能处理所有问题,而只能

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

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

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

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

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

:)这是一个有趣的问题。让我一步一步地讲。这将不能处理所有问题,而只能处理带有字符串参数的函数

下面是一个包含一些基本代码的JSFIDLE:

请注意,我还没有测试过它,所以使用时要格外小心

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

var matchFnName = /^([^(]+)\(([^)]+)\)/.exec(str);
这将提供两个匹配项,一个用于函数名,另一个用于整个参数列表。(除非里面有复杂的表达式,在这种情况下,它将失败:))

提取参数 我刚刚使用简单的语句进行了拆分:

var paramList = paramListStr.split(',');
如果任何字符串包含“,”将失败。您需要更好的解析技术来处理此问题

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

onObject[fnName].apply(onObject, paramList);
看看应用程序。基本上,
apply
所做的就是调用第一个参数
onObject
中提供的对象上的函数,并在第二个参数
paramList
中传递参数列表

希望这有助于你从总体上开始。

:)这是一个有趣的问题。让我一步一步地讲。这将不能处理所有问题,而只能处理带有字符串参数的函数

下面是一个包含一些基本代码的JSFIDLE:

请注意,我还没有测试过它,所以使用时要格外小心

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

var matchFnName = /^([^(]+)\(([^)]+)\)/.exec(str);
这将提供两个匹配项,一个用于函数名,另一个用于整个参数列表。(除非里面有复杂的表达式,在这种情况下,它将失败:))

提取参数 我刚刚使用简单的语句进行了拆分:

var paramList = paramListStr.split(',');
如果任何字符串包含“,”将失败。您需要更好的解析技术来处理此问题

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

onObject[fnName].apply(onObject, paramList);
看看应用程序。基本上,
apply
所做的就是调用第一个参数
onObject
中提供的对象上的函数,并在第二个参数
paramList
中传递参数列表


希望这有助于你开始大体上的方向。

这是<>代码> EVA/<代码>和其他任何名字的一个玫瑰……我会尝试重构以避免把所有的数据放在一个字符串中。我会看看你为什么需要这样做,并考虑重新设计。正如昆汀所说,尽管埃瓦尔邪恶,但这正是它的目的。只需确保字符串不是来自用户输入。您可以构建一个可能函数的“白名单”,然后自己解析字符串。大量的工作和重新发明轮子,但这是可行的;这就是<>代码> EVA/<代码>和其他任何名字的一个玫瑰……我会尝试重构以避免把所有数据放在一个字符串中。我会看看为什么你需要这样做,并考虑重新设计。正如昆汀所说,尽管埃瓦尔邪恶,但这正是它的目的。只需确保字符串不是来自用户输入。您可以构建一个可能函数的“白名单”,然后自己解析字符串。大量的工作和重新发明轮子,但这是可行的;为什么要投否决票?也许我没有说清楚-
eval()
是一个内置函数,它将字符串参数作为源代码执行。如果您能向我展示一种更健壮或更安全的方式来在javascript中执行字符串,我会接受这个downwote。如果没有任何收益,任何开发商都不应该“重新发明轮子”。为什么要投否决票?也许我没有说清楚-
eval()
是一个内置函数,它将字符串参数作为源代码执行。如果您能向我展示一种更健壮或更安全的方式来在javascript中执行字符串,我会接受这个downwote。如果没有任何好处,任何开发人员都不应该“重新发明轮子”。我希望有一些JavaScript foo魔术可以为我解决:)我将标记为已解决,因为这是最好的解决方案我希望有一些JavaScript foo魔术可以为我解决:)我将标记为已解决,因为这是最好的解决方案