JS: Использование имен переменных для вызова функции - PullRequest
0 голосов
/ 31 октября 2010

Я работаю с JQuery.У меня есть приложение, которое делает запросы AJAX на сервер, который отвечает с JSON.

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

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

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

3 голосов
/ 31 октября 2010

Строка - это строка, а не функция.

response.callback() не работает, потому что это то же самое, что "STUFF.TestCallback"() не STUFF.TestCallback()

Возможно, вы хотите, чтобы данные структурировались как-то более похоже на "callback": "TestCallback", а затем выполните:

STUFF[response.callback](response);

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

1 голос
/ 31 октября 2010

Вы можете преобразовать это 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" также будет работать.

0 голосов
/ 31 октября 2010

Вы, вероятно, могли бы сделать

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

, хотя использование eval () считается плохим стилем некоторыми разработчиками JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...