2

JavaScript は私にとって啓示です。C# や Java などの別の種類の古典的な言語のようなものだと思っていましたが、そうではありませんでした。「ダイナミックな世界」はタフで予測不可能。関数は必要な数のパラメーターを受け取ることができると読んだとき、私は驚きました。エラーなし!私はそれがまったく好きではありません。もっと「静的」にしたい、ある種のコンパイル時エラーが欲しい!

私の質問は、それについて心配する必要がありますか? 渡されたパラメータの量が特定の関数が期待するよりも多い場合、例外をスローすることは良い習慣ですか?

function foo(one, two, three)
{
    // Is it good?
    if(arguments.length > arguments.callee.length)
        throw new Error("Wrong quantity of arguments in " + arguments.callee.name + "()");

    /* Stuff */
}

foo(1, 2, 3, 4); // -> Error
foo(1, 2, 3);    // -> OK

私はそれについてまったく心配する必要がありますか?

前もって感謝します!

4

3 に答える 3

6

おそらく心配する必要はありません。このようなエラーの処理方法に関する包括的な規則はありません。エラーのタイプと状況のタイプに完全に依存します。場合によっては、それが重大なプログラミング エラーであり、続行する方法がない場合 (目的の関数を実行するための引数が不十分な場合など)、例外をスローするか、関数からエラーを返すことが理にかなっている場合があります。しかし、それ以外の場合は、余分な引数を安全に無視することができ、その引数が渡されなかったかのように陽気な方法で続行できます。

JavaScript に慣れるにつれて、多くの関数引数をオプションにすることができ、1 つの関数を 0、1、2、3、または N 個の引数で正しく呼び出すことができ、関数内のコードが適切に適応できることが理解できるようになります。これにより、実際には、より「静的」な言語では簡単にできないことを実行できます。引数の型に適応し、引数の型に基づいて適切に何かを行うことさえ可能です。これは、ハードタイプの言語の経験しかない人にとっては異端のように聞こえるかもしれませんが、実際には非常に便利です。

時間をかけてコード本体を維持していくと、関数の定義に引数を追加できるのが便利であることがわかるようになります。その関数にコードを追加して、そうでない場合に適切な値にデフォルト設定します。その関数を使用していた以前のコードを変更する必要はありませんが、その新しい引数を必要とするいくつかの新しい場所では、すぐに使用を開始できます。コードベース全体を調べてその関数のすべての呼び出し元を修正するのではなく、1 つのファイルを 1 つ変更するだけで、他のすべての呼び出し元を変更することなく、すぐに関数への新しい引数の使用を開始できます。これは非常に便利です。


したがって、あなたの質問に対するより直接的な答えとして、関数に渡される余分な引数は、javascript では決して重大なエラーではありません。コードはそれを無視して続行できます。そのコードを書いた開発者に予期しない引数が渡されたことを警告したい場合は、関数/ライブラリの「デバッグ」バージョンで何らかの方法で (おそらくデバッグ コンソールの警告テキストで) 通知することができますが、理由はわかりません。害を及ぼすことなく続行できるのに、関数/ライブラリの「本番」バージョンでの実行を停止する必要がある理由。

于 2012-10-22T22:01:58.787 に答える
3

これについて心配する必要はありません。あまりにも多くの引数を渡すと、関数はそれを無視します。引数が少なすぎる場合にのみエラーをスローする必要があります。その場合、機能が実行できない場合があります。

于 2012-10-22T22:01:38.813 に答える
1

引数の数は重要ではないことに同意しますが (引数を使用する前に取得する引数を型チェックする限り、問題は発生しません)、使用されていない、呼び出されていない引数は機能しないためです。特に懸念がある場合は、渡された引数のサブセットを作成し、そのオブジェクトに内部的にアクセスできます。

function test(arg1, arg2, arg3) {
    var slice = Array.prototype.slice,
        subset = slice.call(arguments, 0, 3); // depending on how many arguments you want
}

もちろん、これはargsオブジェクトからパラメーターを回復する必要があることを意味します。余分な引数は完全に安全であるように見えるため、これは無意味に思えます。しかし、それはまだオプションです。

不要ではありますが。

于 2012-10-22T22:15:05.587 に答える