如何执行名称为字符串的JavaScript函数
我怎么能叫下面的人如何执行名称为字符串的JavaScript函数,javascript,Javascript,我怎么能叫下面的人 var ccall="search.clearMultiSelect"; 我尝试了以下方法: window[ccall]() ccall() 两者都不起作用(我知道原因)。我可以通过eval实现它,但是没有eval还有其他方法吗 我无法拆分字符串或操纵字符串,除非在开头或结尾添加一些内容 基本上,服务器在其响应中包含操作成功时要执行的函数的名称,在本例中如上所述。您可以沿着“.”分割字符串,然后使用[]重复查找。窗口[ccall]()无法工作,因为窗口中没有按名称包含函数“
var ccall="search.clearMultiSelect";
我尝试了以下方法:
window[ccall]()代码>
ccall()代码>
基本上,服务器在其响应中包含操作成功时要执行的函数的名称,在本例中如上所述。您可以沿着“.”分割字符串,然后使用[]重复查找。
窗口[ccall]()
无法工作,因为窗口中没有按名称包含函数“search.clearMultiSelect”。如果可以使用拆分,请尝试以下操作:
window[ccall.split('.')[0]][ccall.split('.')[1]]();
对于深度大于2的函数,可以通过split('.')
数组循环:
var f = window;
var ccallArray = ccall.split('.');
for (var i = 0; i < ccallArray.length; i++){
f = f[ccallArray[i]];
}
f();
var f=window;
var ccallArray=ccall.split('.');
对于(变量i=0;i
您可以使用eval()
下面是一个小例子:
var myFunction = "alert('test');";
eval(myFunction);
下面是测试上述示例的链接:
您必须有有限数量的函数可调用 为了防止评估问题,您可以手动执行以下操作:
if (ccall == "search.func1") func1();
else if (ccall == "search.func2") func2();
else if ....
这不是一个非常令人兴奋的答案,但它应该有效并避免评估
这也使客户端和服务器解耦
当客户端决定通过调用newfunc1()进行响应时,服务器可以发回search.func1反之亦然。您读过这些问题吗?在什么情况下,如果您计划编写代码从字符串调用,您将被禁止拆分字符串?请注意,更新后的问题仍然无法回答您为什么不能只拆分字符串,而只使用
eval
。您在这里所做的将受到注入的影响无论您使用何种方法,都会进行攻击。我同意@RGraham的观点,这是一种不好的做法:导致强耦合。我看不出您的客户端程序有什么理由无法对从服务器接收到的字符串执行任何它想做的操作……对我来说,这似乎是一个好主意。我认为这是最好的解决方案,尤其是使用eval甚至splitting字符串将受到不同类型的攻击。@MazeHatter您可以使用switch
而不是if
s。