2010-10-31 75 views
0

我正在使用jQuery。我有一个应用程序,它向使用JSON响应的服务器发出ajax请求。JS:使用变量名称来调用函数

在某些情况下,从服务器的响应将指示JS函数的名称。如果responseTyp的是“回调”作为JSON的上方通过一个函数来处理这种反应被称为

{"responseType":"callback", "callback":"STUFF.TestCallback","callbackData":"this is in the callback"} 

类型。 (var的“响应”包含上面的JSON)

STUFF.callback = function(response){ 
    if(typeof response.callback =='function'){ 
     console.log("All Good") 
     response.callback(response); 
    }else{ 
     console.log("Hmm... Cant find function",response.callback); 
    } 
} 


STUFF.TestCallBack = function(data){ 
    alert("it worked"); 
} 

但是当我这样做时,我得到错误“response.callback不是函数”。

任何意见,为什么这不起作用,以及如何正确地做到这一点将不胜感激。

回答

3

一个字符串是一个字符串,而不是一个函数。

response.callback()不起作用,因为它是一样的"STUFF.TestCallback"()STUFF.TestCallback()

你可能想拥有的数据结构的东西更像是"callback": "TestCallback"然后再去做:

STUFF[response.callback](response); 

在这里,您使用String访问STUFF的财产。 (foo.barfoo['bar']等同。)

+0

谢谢大卫!后视效果完美! – Alex 2010-10-31 18:26:37

0

虽然使用eval你propably可以做

var myfunction = eval(response.callback); 
myfunction(response); 

()被认为是不好的风格有些JavaScript开发者。

+0

不良风格。难以维护。很难调试。速度慢,效率低下。安全问题的良好来源。 – Quentin 2010-10-31 17:56:02

1

你可以变换“namespace.func”到这样的电话:

STUFF.callback = function(response) { 
    var fn = response.callback.split("."), func = window; 
    while(func && fn.length) { func = func[fn.shift()]; } 
    if(typeof func == 'function') { 
    console.log("All Good") 
    func(response); 
    } else{ 
    console.log("Hmm... Cant find function", response.callback); 
    } 
} 

这里做的事情是通过获取window["STUFF"]然后window["STUFF"]["TestCallback"]抢功能,因为它循环,检查是否每个级别的定义为:去防止错误。请注意,这也适用于任何关卡功能,例如"STUFF.One.Two.func"也可以。

相关问题