クライアント(ブラウザー)とサーバー(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バリデーターを通過させる方法はありますか?