5

1つのスクリプトに300個の関数があるとしましょう。名前付きパラメーターを渡すのではなく、各関数内の引数オブ​​ジェクトにアクセスするのは悪いことですか?

編集:さて、あなたの多くは私がこれをやりたい理由を尋ねています、それは本当に理論的な質問ですが、あなたが尋ねたので、可変パラメーター以外に私がこれをやりたい理由はありますか?

4

3 に答える 3

15

読みにくく、他の人が理解、維持、または使用するのが難しいコードを書くことは悪い習慣です。

名前付き引数を指定し、可能な場合はいつでも意味のある、便利でわかりやすい名前を付けることをお勧めします

また、すべてが必須ではない場合でも、名前付き引数を宣言できることを覚えておく必要があります。次に、arguments.length渡された引数の数をテストするか、特定の名前付き引数の値をテストして、渡されたかどうかを確認undefinedできます。

非常に可変的な引数の場合は、オブジェクトを渡して、渡された引数をオブジェクトに自己記述させることもできます。

引数オブジェクトが有用であり、それを使用することが明確で簡潔で安全なコードを書くための最良の方法である場合がありますが、すべての関数が名前付き引数を宣言せず、引数オブジェクトのみを使用する場合は見たことがありません。非常に珍しいプロジェクトがない限り、これは通常、非常に多くの関数をコーディングするための最良の方法ではありません。

パフォーマンスのために、名前付き引数へのアクセスは、すべての主要なブラウザーで引数オブジェクトにアクセスするよりも高速であるように見えます。テスト関数に渡された最初の3つの引数を合計するだけのこのjsperfパフォーマンステストでは、名前付き引数をarguments使用すると、オブジェクトを使用するよりも2〜8倍高速でした。正確なパフォーマンスの違いは、関数が実行しようとしていることによって異なる可能性がありますが、argumentsオブジェクトの外観は明らかに遅くなります。

名前付き引数の代わりにargumentsオブジェクトを使用する理由、またはargumentsオブジェクトを使用することが有益であると考える理由についてさらに情報を提供すると、より具体的なアドバイスを提供できる可能性があります。

于 2012-11-08T23:16:31.577 に答える
3

jfriend00の優れた回答に加えて...

最新の Javascript エンジン [1] の中には、変数を作成しargumentsない限り、変数を作成しないものがあります。

  • 関数で使用
  • 関数はeval、または同様の構造を使用します

したがって、 using を使用argumentsすると、関数を使用するだけで関数の速度が低下する可能性があります。

[1] 特に Chrome の V8。

于 2012-11-08T23:38:23.363 に答える
0

厳密モードは引数オブジェクトに影響することに注意してください。

非厳密モードでは、引数メンバーは対応する仮パラメーター (値が渡された場合) にバインドされるため、一方の値を変更すると他方の値も変更されます。

厳密モードではそうではありません。

例えば

foo('a');

function foo(arg) {

  // Change the value of arg
  arg = 'b';           

  arg == arguments[0];  // false in strict mode, 
                        // true otherwise
}

また、厳密モードでは使用できませんarguments.calleearguments.callerそれらにアクセスしようとすると、エラーがスローされます。

于 2012-11-09T02:02:39.827 に答える