У меня есть некоторые функции JavaScript, которые выполняются как на клиенте (браузере), так и на сервере (в контексте Java Rhino). Это небольшие функции - в основном мало валидаторы, которые хорошо определены и не зависят от глобальных или закрытых - автономных и портативных.
Вот пример:
function validPhoneFormat(fullObject, value, params, property) {
var phonePattern = /^\+?([0-9\- \(\)])*$/;
if (value && value.length && !phonePattern.test(value))
return [ {"policyRequirement": "VALID_PHONE_FORMAT"}];
else
return [];
}
Чтобы сохранить вещи DRY, мой код сервера получает дескриптор каждой из этих функций и вызывает toString() на них, возвращая их в браузер как часть объекта JSON. Что-то вроде этого:
{ "name" : "phoneNumber",
"policies" : [
{ "policyFunction" : "\nfunction validPhoneFormat(fullObject, value, params, property) {\n var phonePattern = /^\\+?([0-9\\- \\(\\)])*$/;\n if (value && value.length && !phonePattern.test(value)) {\n return [{\"policyRequirement\":\"VALID_PHONE_FORMAT\"}];\n } else {\n return [];\n }\n}\n"
}
]
}
Мой браузер JS-код затем берет этот ответ и создает экземпляр этой функции в этом контексте, например:
eval("var policyFunction = " + this.policies[j].policyFunction);
policyFailures = policyFunction.call(this, form2js(this.input.closest("form")[0]), this.input.val(), params, this.property.name));
Все это работает очень хорошо. Однако я запускаю этот код через JSLint, и я возвращаю это сообщение:
[ERROR] ValidatorsManager.js: 142: 37: eval - это зло.
Я ценю, что часто eval может быть опасным. Однако я понятия не имею, как еще я мог реализовать такой механизм, не используя его. Есть ли способ, которым я могу это сделать, а также пройти проверку достоверности JSLint?