我的字符串是我的javaScript函数:
var foo = "CONCATENATE('a', ' ', 'b')";
如何在不使用eval()
的情况下对此函数进行javaScript调用?
答案 0 :(得分:2)
:)这是一个有趣的问题。让我一步一步完成这一步。这将无法处理所有内容,只能处理带字符串参数的函数。
这是一个jsFiddle,其中包含一些基本代码:http://jsfiddle.net/Sqa8L/
请注意,我根本没有测试过,所以要特别小心使用。
理想情况下,我建议使用某种解析器来获得更可靠的结果,但我认为一旦理解了一般概念,就可以完成这个答案。所以,正则表达式首先:
var matchFnName = /^([^(]+)\(([^)]+)\)/.exec(str);
这将为您提供两个匹配项,一个用于函数名称,第二个用于整个参数列表。 (除非你有复杂的表达式,在这种情况下,它会失败:))。
我刚刚使用简单的声明进行拆分:
var paramList = paramListStr.split(',');
如果任何字符串包含',',则会失败。您需要一种更好的解析技术来处理这个问题。
您需要发送一个响应函数调用的对象,或者默认为全局范围。
onObject[fnName].apply(onObject, paramList);
看看申请here。基本上,apply
所做的是在第一个参数onObject
中提供的对象上调用函数,并在第二个参数paramList
中传递参数列表。
希望这有助于让您从大方向开始。
答案 1 :(得分:1)
无论您使用哪种解决方案,它都会在javascript级别隐式或显式调用eval()
,或者在引擎级别上等效。