JS:使用变量名称来调用函数
我正在使用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不是函数”。
任何意见,为什么这不起作用,以及如何正确地做到这一点将不胜感激。
一个字符串是一个字符串,而不是一个函数。
response.callback()
不起作用,因为它是一样的"STUFF.TestCallback"()
不STUFF.TestCallback()
你可能想拥有的数据结构的东西更像是"callback": "TestCallback"
然后再去做:
STUFF[response.callback](response);
在这里,您使用String访问STUFF
的财产。 (foo.bar
和foo['bar']
等同。)
虽然使用eval你propably可以做
var myfunction = eval(response.callback);
myfunction(response);
()被认为是不好的风格有些JavaScript开发者。
不良风格。难以维护。很难调试。速度慢,效率低下。安全问题的良好来源。 – Quentin 2010-10-31 17:56:02
你可以变换“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"
也可以。
谢谢大卫!后视效果完美! – Alex 2010-10-31 18:26:37