4

JavaScript では、一部の関数に一部の引数を渡さないことが有効です。undefinedそれらは、多くの関数のロジックにとって不可欠なものとして扱われます。

「十分な引数がありません」と呼ばれるこのエラーについて読みました。標準ですか?なぜそれが存在するのですか?

function foo(a) {
  // yada yada
}
try {
  foo();
} catch (e) {
  console.log(e.name);
}

^ このコードは、Firefox と Chrome では何もスローしませんでした。

4

4 に答える 4

7

「十分な引数がありません」と呼ばれるこのエラーについて読みました。

これは標準的な言語レベルのエラーではありません。これはAPI レベルのエラーです。つまり、JavaScript は通常、関数に渡される実引数の数が関数の仮引数と一致するかどうかを気にしません。ただし、JavaScript で記述された特定の API は、引数の数を気にする場合があります。

たとえば、Firefox の関数 (Firefox の DOM API の一部) は、少なくとも 2 つの引数を期待するように定義されているaddEventListenerため、「引数が不足しています」というエラーをスローする可能性があります。addEventListener

argumentsobjectを使用して、関数に渡される実際の引数の数をテストできます。

function foo(a, b) {
    if(arguments.length < 2) {
        throw TypeError("Not enough arguments; two expected");
    }

    if(arguments.length > 2) {
        throw TypeError("Too many arguments; two expected");
    }

    if(arguments.length > 10) {
        throw TypeError("Way too many arguments; did you even read the docs?");
    }
}

引数の不一致によってエラーが発生するようにするには、コードで引数の数を検出し、アクティブにエラーをスローする必要があります。このバージョンのは、ブロックに引っかかるfoo スローします。TypeErrorcatch

ただし、エラーは の仮引数の数とは関係がないことに注意してくださいfoo。として定義することもできましたがfunction foo(a,b,c)、 をチェックすることで 2 つの引数の要件を強制していましたarguments

于 2013-09-17T18:14:57.183 に答える
2

JavaScript では、引数は常にオプションです。ただし、特定の API に対してオプションであるという意味ではありません。検討:

function foo(a) {
  if (a === undefined) {
    var e = {};
    e.name = "Not enough arguements";
    e.message = "All your base r belong to us.";
    throw e;
  } 
  // yada yada
}
try {
  foo();
} catch (e) {
  console.log(e.name);
}

現在は必須パラメーターです。これは、いくつかのデフォルトの DOM メソッドの場合であり、その例外をググれば見つかります。

于 2013-09-17T18:10:18.967 に答える
1

プログラマー定義の JavaScript 関数には可変アリティがあり、アリティは厳密には適用されません (それを行う方法はありますが)。ただし、ネイティブ関数はアリティを強制できます。たとえばaddEventListener、イベントを表す文字列とイベント ハンドラの 2 つの引数が必要です。両方の引数が指定されていない場合、「引数が不足しています」というエラーが発生する可能性があります。前に述べたように、特定の数のパラメーターが必要な場合は、このエラーを自分でスローできます。

ただし、これは厳密には適用されません。Chrome では、何も指定しないか 1 つのパラメーターのみをaddEventListenerに指定でき、エラーは報告されません。ただし、Firefox はより厳密であり、「引数が不足しています」というエラーを吐き出します。

このエラーが存在する理由は、すべての引数が指定されていないと関数を実行しても意味がないためです。もちろん、なぜ Chrome がエラーを吐き出さないのか疑問に思う人もいるでしょう。

于 2013-09-17T18:08:04.877 に答える
0

String「十分な引数がありません」は、標準の DOM 操作メソッドを間違った型の引数 ( の代わりなど)で呼び出そうとしたときにのみ、Firefox によって表示されますFunction

プレーンな JavaScript にはそのような概念はなく、独自の関数を使用している場合、このエラーは発生しません。

于 2013-09-17T18:10:49.227 に答える