1

Javascript では、必要以上のパラメーターを指定して任意のメソッドを呼び出すことができ、余分なパラメーターは黙って無視されます。

例えば

letters = ['a','b','c']
//correct
letters.indexOf('a')
//This also works without error or warning
letters.indexOf('a', "blah", "ignore me", 38)

これが発生するケースを検出する方法はありますか?

私の動機は、私の経験では、これが発生するケースは通常バグであるということです。コード分​​析または実行時にこれらを特定すると、これらのエラーを追跡するのに役立ちます。

これらのケースは、発生していない可能性のある基本型の変更を人々が予期している場合に特によく見られます。これが発生した場合の警告をログに記録する

例えば

Date.parse('02--12--2012', 'dd--MM--YYYY')

注: 明確にするために、私のコードと他の人のコード全体にチェックを振りかける必要のない解決策が欲しいです。

4

4 に答える 4

2

オブジェクトを使用できargumentsます。

function myFunction(param1,param2)
{
   if (arguments.length!=2)
   {
       // wrong param number!
   }
   ...
}

あなたの編集によると:元の機能に触れることなく、自動化された形式のチェックを実装したい場合:

各関数を次のように処理する必要があります。

functionName = debug(functionName, numberOfExpectedArgs);

この操作は、引数の数をチェックして関数をラップします。

したがって、サンプル関数はそのままにしておきます

// this is the original function... we want to implement argument number
// checking without insertint ANY debug code and ANY modification

function myFunction(a,b,c)
{
    return a + " " + b + " " + c;
}

// the only addition is to do this...
myFunction = debug(myFunction,3); // <- implement arg number check on myFunction for 3 args

// let's test it...    
console.log(myFunction(1,2,3));
console.log(myFunction(1,2));

このdebug()関数を実装する必要があります:

function debug(f, n)
{
    var f2 = f;
    var fn = function()
        {
            if (arguments.length!=n) console.log("WARNING, wrong argument number");
            return f2.apply(f2, arguments);
        };
    return fn;
}

​

このソリューションは、既に定義されている関数に従って完全に透過的であるため、求めるものになる可能性があります。非推奨 (いくつかあります) とクロスブラウザーの互換性を確認することを強くお勧めします。

于 2012-06-17T20:18:33.750 に答える
2

JavaScript の関数はオブジェクトです。そのため、プロパティがあります。関数が期待する引数の数を指定する length MDNプロパティを使用して、必要なものを実現できます。

function say ( hello, world ) {
    alert ( 
      "arguments length = " + arguments.length + "\n" +
      "defined with = " + say.length
    );
}
say ( "this ", "brave ", "new ", "world" );​

これはIE8でも機能します。デモ。あなたの場合、このようなことができます。

于 2012-06-17T21:49:54.610 に答える
1

Javascript は非常に動的な言語であり、その便利な機能の多くは、いくつかのチェックを静的に実行することを不可能にします。

暗黙的なオブジェクトが存在argumentsするということは、関数がすべての関数に対して期待する引数の数を自動的に決定する方法がないことを意味します。多くの var-arg 関数は、正式な引数を宣言せず、argumentsオブジェクトを排他的に使用します。

確実にできることは、Cranioが提案したように各機能で手動でチェックすることだけです.

自動化されたチェックが必要な場合、たとえば単体テストの一部として、length仮引数の数を返す Function オブジェクトのプロパティを利用できます。var-arg 関数の場合は、チェックを含めないでください。例えば:

function checkNumberOfArguments(args) {
    if (args.length != args.callee.length) {
        throw new Error('Wrong number of arguments');
    }
};

// Use it like

function a(b) {
    checkNumberOfArguments(arguments);
}

a(1);
a(1,2);
于 2012-06-17T20:41:40.493 に答える
0

オブジェクトを使用できる関数内argumentsで、関数が呼び出されたときに関数に提供されたすべての引数の配列が含まれています。

function x(){
  return arguments.length;
}

x()
=> 0
x(1,1,1,1,1,1,1,1,1)
=> 9
于 2012-06-17T20:20:38.397 に答える