У меня есть некоторые функции 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?
