1つのスクリプトに300個の関数があるとしましょう。名前付きパラメーターを渡すのではなく、各関数内の引数オブジェクトにアクセスするのは悪いことですか?
編集:さて、あなたの多くは私がこれをやりたい理由を尋ねています、それは本当に理論的な質問ですが、あなたが尋ねたので、可変パラメーター以外に私がこれをやりたい理由はありますか?
1つのスクリプトに300個の関数があるとしましょう。名前付きパラメーターを渡すのではなく、各関数内の引数オブジェクトにアクセスするのは悪いことですか?
編集:さて、あなたの多くは私がこれをやりたい理由を尋ねています、それは本当に理論的な質問ですが、あなたが尋ねたので、可変パラメーター以外に私がこれをやりたい理由はありますか?
読みにくく、他の人が理解、維持、または使用するのが難しいコードを書くことは悪い習慣です。
名前付き引数を指定し、可能な場合はいつでも意味のある、便利でわかりやすい名前を付けることをお勧めします。
また、すべてが必須ではない場合でも、名前付き引数を宣言できることを覚えておく必要があります。次に、arguments.length
渡された引数の数をテストするか、特定の名前付き引数の値をテストして、渡されたかどうかを確認undefined
できます。
非常に可変的な引数の場合は、オブジェクトを渡して、渡された引数をオブジェクトに自己記述させることもできます。
引数オブジェクトが有用であり、それを使用することが明確で簡潔で安全なコードを書くための最良の方法である場合がありますが、すべての関数が名前付き引数を宣言せず、引数オブジェクトのみを使用する場合は見たことがありません。非常に珍しいプロジェクトがない限り、これは通常、非常に多くの関数をコーディングするための最良の方法ではありません。
パフォーマンスのために、名前付き引数へのアクセスは、すべての主要なブラウザーで引数オブジェクトにアクセスするよりも高速であるように見えます。テスト関数に渡された最初の3つの引数を合計するだけのこのjsperfパフォーマンステストでは、名前付き引数をarguments
使用すると、オブジェクトを使用するよりも2〜8倍高速でした。正確なパフォーマンスの違いは、関数が実行しようとしていることによって異なる可能性がありますが、arguments
オブジェクトの外観は明らかに遅くなります。
名前付き引数の代わりにargumentsオブジェクトを使用する理由、またはargumentsオブジェクトを使用することが有益であると考える理由についてさらに情報を提供すると、より具体的なアドバイスを提供できる可能性があります。
jfriend00の優れた回答に加えて...
最新の Javascript エンジン [1] の中には、変数を作成しarguments
ない限り、変数を作成しないものがあります。
eval
、または同様の構造を使用しますしたがって、 using を使用arguments
すると、関数を使用するだけで関数の速度が低下する可能性があります。
[1] 特に Chrome の V8。
厳密モードは引数オブジェクトに影響することに注意してください。
非厳密モードでは、引数メンバーは対応する仮パラメーター (値が渡された場合) にバインドされるため、一方の値を変更すると他方の値も変更されます。
厳密モードではそうではありません。
例えば
foo('a');
function foo(arg) {
// Change the value of arg
arg = 'b';
arg == arguments[0]; // false in strict mode,
// true otherwise
}
また、厳密モードでは使用できませんarguments.callee
。arguments.caller
それらにアクセスしようとすると、エラーがスローされます。