以下は、任意の関数から使用できるスタンドアロンの検証関数で、渡された引数の存在と、ハンガリー語表記を使用した型の正確性をチェックします。
function fnDrawPrism(length, numWidth, intHeight){
//If any of these parameters are undefined, throw an error that lists the missing parameters.
// you can cut-and-past the declaration line to fill out 90% of the validation call:
validate(fnDrawPrism, length, numWidth, intHeight);
return length * numWidth * intHeight;
}
// this is cut-and-pasted into a file somewhere, edit to add more types or stricter checking
function validate(args){
var fn = args, actuals = [].slice.call(arguments, 1),
hung = {int: "Number", num: "Number", str: "String", arr: "Array",
obj: "Object", inp: "HTMLInputElement", dt: "Date", bln: "Boolean",
rx: "RegExp", frm: "HTMLFormElement", doc: "HTMLDocument"},
names = String(fn).split(/\s*\)\s*/)[0].split(/\s*\(\s*/)[1].split(/\s*\,\s*/),
mx = names.length, i = 0;
if(!fn.name)
fn.name = String(fn).split(/\s*(/)[0].split(/\s+/)[1] || 'anon';
for(i; i < mx; i++){
if(actuals[i] === undefined)
throw new TypeError("missing arg #" + i + " in " + fn.name + " - " + names[i]);
var hint = hung[names[i].split(/[A-Z]/)[0]],
got = toString.call(actuals[i]).split(/\W/)[2];
if(hint && got !== hint)
throw new TypeError("Wrong type in argument #" + i + " of " + fn.name + " - " + names[i] + ". Got: " + got + ", Expected: " + hint);
}
//try it out:
fnDrawPrism(1); //! missing arg #1 in fnDrawPrism - numWidth
fnDrawPrism(1,4); //! missing arg #2 in fnDrawPrism - intHeight
fnDrawPrism(1,2,3); // ok
fnDrawPrism(1,"2",3); //! Wrong type in argument #1 of fnDrawPrism - numWidth. Got: string, Expected: number
「引数」をバリデーターに渡すことができない理由は、厳密モードでは引数オブジェクトに多くの制限が課せられ、確実に使用できないためです。Ecma6にはすべての引数を一度に渡す方法がありますが、それは将来のブラウザーでのみ機能しますが、長い方法はブラウザーで当時、現在、そして永遠に機能します...
編集: コメントに基づいて検証ルーチンを更新し、ドキュメント、入力、フォーム、配列、正規表現、日付、およびオブジェクトをハンガリー語表記の検証ルーチンに追加して、少し強力にします。これは、ウィンドウ オブジェクト全体でも機能するようになりました。