Javascript JS:使用变量名调用函数
我正在使用jQuery。我有一个应用程序,它向服务器发出ajax请求,并用JSON进行响应 在某些情况下,服务器的响应将指示要调用的JS函数的名称Javascript JS:使用变量名调用函数,javascript,jquery,json,function,variables,Javascript,Jquery,Json,Function,Variables,我正在使用jQuery。我有一个应用程序,它向服务器发出ajax请求,并用JSON进行响应 在某些情况下,服务器的响应将指示要调用的JS函数的名称 {"responseType":"callback", "callback":"STUFF.TestCallback","callbackData":"this is in the callback"} 如果响应类型如上所述为“callback”,则JSON将传递给一个函数以处理此响应类型。(var“response”包含上面的JSON) 但当我这
{"responseType":"callback", "callback":"STUFF.TestCallback","callbackData":"this is in the callback"}
如果响应类型如上所述为“callback”,则JSON将传递给一个函数以处理此响应类型。(var“response”包含上面的JSON)
但当我这样做时,我会得到错误“response.callback不是函数”
如果您对这一点不起作用的原因以及如何正确操作提出任何意见,我们将不胜感激 字符串是字符串,不是函数
response.callback()
不起作用,因为它与“STUFF.TestCallback”(
不是STUFF.TestCallback()
您可能希望数据的结构更像“回调”:“TestCallback”
,然后执行以下操作:
STUFF[response.callback](response);
这里使用字符串访问
STUFF
的属性。(foo.bar
和foo['bar']
等效。)字符串是字符串,而不是函数
response.callback()
不起作用,因为它与“STUFF.TestCallback”(
不是STUFF.TestCallback()
您可能希望数据的结构更像“回调”:“TestCallback”
,然后执行以下操作:
STUFF[response.callback](response);
这里使用字符串访问STUFF
的属性。(foo.bar
和foo['bar']
是等效的。)您可能会这样做
var myfunction = eval(response.callback);
myfunction(response);
尽管一些javascript开发人员认为使用eval()是一种糟糕的风格。您可能会这样做
var myfunction = eval(response.callback);
myfunction(response);
尽管一些javascript开发人员认为使用eval()是一种糟糕的风格。您可以将“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”
也适用。您可以将该“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”
也适用。糟糕的样式。很难维持。很难调试。缓慢而低效。安全问题的好来源。糟糕的风格。很难维持。很难调试。缓慢而低效。安全问题的好来源。谢谢David!事后看来,这是完全有道理的!谢谢你,大卫!事后看来,这是完全有道理的!