2010-10-31 2 views
0

Im работает с jQuery. У меня есть приложение, которое делает запросы ajax на сервер, который отвечает JSON.JS: Использование имен переменных для вызова функции

в некоторых случаях ответ от сервера будет указывать имя функции JS называться

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

Если responseType является «обратный вызов», как выше JSON передается функции для обработки этого ответа тип. (Переменный «ответ» содержит 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); 

Здесь вы используете строку для доступа к объекту STUFF. (foo.bar и foo['bar'] эквивалентные.)

+0

Спасибо, Дэвид! Имеет прекрасный смысл в заднем свете! – Alex

0

Вы Propably могли бы сделать

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

хотя использование Eval() рассматриваются как плохой стиль некоторых яваскрипта разработчиков.

+0

Плохой стиль. Трудно поддерживать. Трудно отлаживать. Медленный и неэффективный. Хороший источник проблем безопасности. – Quentin

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" будет работать.