JS:使用变量名来调用函数

时间:2010-10-31 17:46:11

标签: javascript jquery json function variables

我正在使用jQuery。我有一个应用程序,使用JSON响应服务器的ajax请求。

在某些情况下,来自服务器的响应将指示要调用的JS函数的名称

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

如果responseType是“回调”,则将JSON传递给函数以处理此响应类型。 (var“response”包含上面的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 个答案:

答案 0 :(得分:3)

String是String,而不是Function。

response.callback()不起作用,因为它与"STUFF.TestCallback"()相同而不是STUFF.TestCallback()

您可能希望数据的结构更像"callback": "TestCallback",然后执行:

STUFF[response.callback](response);

在这里,您可以使用String来访问STUFF的属性。 (foo.barfoo['bar']相同。)

答案 1 :(得分: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"也可以。

答案 2 :(得分:0)

你可以做到

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

虽然使用eval()被一些javascript开发人员认为是一种糟糕的风格。