我有一些在客户端(浏览器)和服务器(在 Java Rhino 上下文中)上运行的 JavaScript 函数。这些是小函数——基本上是定义良好且不依赖全局变量或闭包的小验证器——自包含且可移植。
这是一个例子:
function validPhoneFormat(fullObject, value, params, property) {
var phonePattern = /^\+?([0-9\- \(\)])*$/;
if (value && value.length && !phonePattern.test(value))
return [ {"policyRequirement": "VALID_PHONE_FORMAT"}];
else
return [];
}
为了保持干燥,我的服务器代码获取每个函数的句柄并调用它们的 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 运行这段代码,我得到了这条消息:
[错误] ValidatorsManager.js:142:37:eval 是邪恶的。
我经常意识到 eval 可能很危险。但是,我不知道如何在不使用它的情况下实现这样的机制。有什么办法可以做到这一点并通过 JSLint 验证器?