2011-09-04 4 views
15

可能性の重複に1つの関数から可変個の引数を渡す:
Is it possible to send a variable number of arguments to a JavaScript function?

私は関数内で可変個の引数を取得するためにargumentsを使用することができますが、どのように私ができますそのプロトタイプを知らずに別の関数に渡しますか?

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f(arguments); } // not correct, what to do? 
run(show, 'foo', 'bar'); 

注:私はrunに渡される関数fのために必要な引数の数を保証することはできません。あなたはここでuはそれを行う方法です。..関数を適用使用する必要が

function run(f) { f(arguments[1], arguments[2]); } 
+0

に動作を示すために、変数引数を渡すために、それは' arguments'を使用していません。私はすでに、運が無ければそのように「適用」を試みました。 – steveo225

+0

あなたが今気づいたように、 'apply'がこれを行う唯一の方法です。したがって、*は重複しています。 –

+0

はい、「引数」が全く異なっていて、最終的には質問のポイントであった点を除いては、 – steveo225

答えて

26

プログラムで生成された引数のセットを関数に渡す主な方法は、関数の 'apply'メソッドを使用することです。あなたの例では

function show(foo, bar) { 
    window.alert(foo+' '+bar); 
} 
function run(f) { 
    // use splice to get all the arguments after 'f' 
    var args = Array.prototype.splice.call(arguments, 1); 
    f.apply(null, args); 
} 

run(show, 'foo', 'bar'); 
+0

Posterityの場合、関数がオブジェクトメソッドであり、コンテキストを保持する必要がある場合は、 'f.apply(this、args); 'で' null'の代わりに 'this'オブジェクトを渡します。 – tmthydvnprt

1

:意味、示された例は、2つの引数を持っているにもかかわらず、それが0 - 無限の可能性があり、その次適切ではありません:私が正しくあなたの質問を理解している場合は、実際に行うことができます

function variableFunction1() 
    { 

    alert("variableFunction1 arguments length: " + arguments.length); 

    // calls second varargs function keeping current 'this'. 
    variableFunction2.apply(this, arguments); 
} 

function variableFunction2() 
{ 

    alert("variableFunction2 arguments length: " + arguments.length); 
} 

variableFunction1('a','b','c'); 

Demo

6

これは、適用すると:

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f, args) { f.apply(null,args); } 
run(show, ['foo', 'bar']); 
+0

その問題は、私はすでに 'arguments'を使ってフレームワークをセットアップしていて、配列を使うためのすべての呼び出しを切り替えたくないということです。同様のことではなく、オブジェクトから配列へ 'arguments'を変換して渡すことができます。 – steveo225

+0

@Loganのソリューションを見て、必要なことをするようです。 – spike

0

これは私がshow`は引数を定義している `、あなたが見ることができるように、反対する

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f.apply(null, Array().slice.call(arguments, 1)); } 
run(show, 'foo', 'bar');