Вы ничего не можете сделать в JSON, чтобы получить желаемый результат, потому что у JSON нет понятия функций, это просто нотация данных.Но есть вещи, которые вы можете делать на стороне клиента.
Если ваша foobarfun
функция является глобальной функцией (против которой я бы порекомендовал, мы к этому придем), то вы можете вызвать ее так:
window[options.formatting_function]();
Это работает, потому что глобальные функции являются свойствами объекта window
, и вы можете получить доступ к свойствам либо с помощью точечной нотации и литералов (window.foobarfun
), либо с помощью нотации в скобках и строк (window["foobarfun"]
).В последнем случае, конечно, строка не обязательно должна быть строковым литералом, это может быть строка из свойства - например, вашего options.formatting_function
свойства.
Но я неРекомендуем использовать глобальные функции, объект window
уже очень переполнен.Вместо этого я храню все свои функции (или как можно больше, в некоторых крайних случаях) в основной функции области видимости, поэтому я ничего не добавляю в глобальное пространство имен:
(function() {
function foobarfun() {
}
})();
Теперь, если высделать это, вы не можете получить доступ к foobarfun
на window
, потому что весь смысл этого состоит в том, чтобы избежать его на window
.Вместо этого вы можете создать свой собственный объект и присвоить ему следующее свойство:
(function() {
var myStuff = {};
myStuff.foobarfun = foobarfun;
function foobarfun() {
}
function client_script() {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, async=true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
options = JSON.parse(xhr.responseText);
myStuff[options.formatting_function](); // <== using it
}
};
xhr.send(null);
}
})();
Часто вместо этого:
myStuff.foobarfun = foobarfun;
function foobarfun() {
}
вы увидите, что люди пишут:
myStuff.foobarfun = function() {
};
Я тоже не рекомендую, потому что тогда ваша функция анонимна (свойство в myStuff
, которое ссылается на функцию, имеет имя, а функция - нет).Давать имена функций - это хорошо, это помогает вашим инструментам помочь вам (показывая вам имена в стеках вызовов, сообщениях об ошибках и т. Д.).
Вы также можете увидеть:
myStuff.foobarfun = function foobarfun() {
};
и что должно быть действительным, это правильный JavaScript.Но, к сожалению, различные реализации JavaScript имеют различные ошибки вокруг этого (который называется выражением именованной функции ), особенно Internet Explorer до IE9, который создаст две совершенно разные функции на двухразные времена.
Все это говорит, что передача имен функций между клиентом и сервером обычно предполагает, что вы хотите отступить назад и снова взглянуть на проект.Данные должны управлять логикой, но не таким буквальным образом.Тем не менее, есть определенно допустимые варианты использования для этого, у вас вполне может быть один в вашей ситуации.