2012-04-05 13 views
3

あなたが別のある関数のすべてのパラメータを別の関数に渡しますか? (ジャバスクリプト)

function a(){ 
    arguments.length;// this is 1 
    // how do I pass any parameter function a receives into another function 
    b(what to put here?); // say pass all parameters function a receives to function b 
} 
a('asdf'); // this is okay 

に1つの関数のすべてのパラメータを渡すにはどうすればよいので、関数aはパラメータのX番号を受信した場合、各パラメータは、その後、同じ順序で関数bに渡されます。だからa( "1"、 "2"); 、b( "1"、 "2"); a( "1"、2、[3]); 、b( "1"、2、[3]);

答えて

5

使用Function.prototype. apply(thisArg[, argsArray])は、そうのような:

b.apply(this, arguments); 

argumentsは離れて、そのNインデックスプロパティから(calleeのような)いくつかの他の特性を有するアレイ状の物体です。したがって、おそらくArray.prototype. slice()を使用して、オブジェクトを引数の単純な配列に変換する必要があります(現代の環境でも機能します)。

b.apply(this, Array.prototype.slice.call(arguments)); 

も参照してください:Function.prototype. call()

2

単一のオブジェクトとしてそれらを渡さない、なぜ?単一のオブジェクトをパラメータとして使用する利点は、

  • の順番である必要はありません。それが受信コレクションの第1、第2、第3のものであるかどうかを知る必要がある引数とは異なり、オブジェクト内ではただのものです。必要なときに電話してください。
  • あなたは何人が渡されたか心配することはありません。あなたがプロパティを多く含む一つのオブジェクトを送信することができます - あなたが唯一の呼び出し元と呼び出し先ofcourseの

の間に1つの引数を渡す、あなたは

function foo(data){ 
    data.param1; //is foo 
    data.param2; //is bar 
    data.param3; //is baz 

    //send params to bar 
    bar(data); 
} 

function bar(info){ 
    info.param1; //is foo 
    info.param2; //is bar 
    info.param3; //is baz 
} 

//call function foo and pass object with parameters 
foo({ 
    param1 : 'foo', 
    param2 : 'bar', 
    param3 : 'baz' 
}) 
+0

同じ機能を使用する前に、彼らが存在する場合は、それらをテストする必要があります内部的にはブラウザのjavascriptによって提供されていますが、なぜ再び心配する必要があります。また、スライスとスプライス関数を使って変更を加えることもできます:http://stackoverflow.com/questions/3914557/passing-arguments-forward-to-another-javascript-function – iMatoria

+0

名前付きパラメータは、全体的に見てより良いパラダイムですが、 JavaScriptでは組み込みの方法には少なくともES5では番号が付けられています。したがって、オブジェクトをラップしたりアンラッピングするのではなく、単にパラメータをそのまま転送するのはちょっと直感的です。もちろん、いくつかの状況ではオブジェクトテクニックが必要です。 – Beejor

+0

@Beejorと私はこれが2012年に返答されたと信じており、より良い答えがすでに選択されています。 – Joseph

関連する問題