У меня есть код JavaScript, который указан в файле конфигурации на стороне сервера. Поскольку я не могу указать функцию JavaScript на языке конфигурации (Lua), у меня есть она как строка. Сервер возвращает строку в некотором JSON, и я интерпретирую ее с помощью функции очистки:
parse_fields = function(fields) {
for (var i = 0; i < fields.length; ++i) {
if (fields[i].sortType) {
sort_string = fields[i].sortType;
fields[i].sortType = eval(sort_string);
}
return fields;
}
};
В принципе, он просто оценивает sortType
, если он существует. Проблема в том, что Firebug сообщает об ошибке "Синтаксическая ошибка" в строке eval()
. Когда я запускаю те же шаги в консоли Firebug, он работает без проблем, и я могу выполнить функцию, как я ожидаю. Я пробовал несколько разных вариантов: window.eval
вместо обычного eval
, сохраняя sortType
, как я уже говорил выше, и пробовал небольшие изменения в строке.
Образец значения fields[i].sortType
равен "function(value) { return Math.abs(value); }"
. Здесь тестирование, которое я сделал в консоли Firebug:
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
и сама ошибка в Firebug:
syntax error
[Break on this error] function(value) { return Math.abs(value); }
Последний бит, который может быть уместным, заключается в том, что все это завернуто в функцию Ext JS onReady()
с изменением пространства имен Ext.ns
вверху. Но я предположил, что window.eval
будет вызывать глобальный eval
, независимо от любого возможного eval
в более конкретных пространствах имен.
Любые идеи приветствуются.