2012-03-26 6 views
2

の尾を持つ関数:呼び出し、私は別のものに(どのように多く知られていない)、残りを送った後、最初の引数を使用する機能 を書くしようとしている呼び出し先の引数リスト

function consume_data() { 
    args = consume_data.arguments; 
    do_some(args[0]); 
    consume_the_rest(args[1], args[2], args[3] ...); 
} 

コールとevalを構成するために文字列を使用する必要がありますか、それとももっと良い方法がありますか?

答えて

5

伝統的なJavaScriptの方法...残念ながら。

function consume_data() { 

    do_some(arguments[0]); 

    var args = Array.prototype.slice.call(arguments, 1); 

    consume_the_rest.apply(this, args); 
} 

ローカル変数のスコープで提供されますarguments変数を使用する必要があります。 .slice()Array.prototypeから借りて、2番目から始まる引数の配列を取得します。

.apply()メソッドを使用して、これらの引数をコレクションとして渡します。これは、consome_the_restメソッドの個々の引数に分解されます。


なぜですか?

あなたがArray.prototype.sliceを借りる必要がある理由はargumentsオブジェクトが本当にアレイではないということですので、試作したアレイ方法を持っていません。

.apply()に与えられた最初の引数は、呼び出している関数の呼び出しコンテキストthis値)を設定し、私は上記のように、argsアレイは、関数の実行コンテキストで個々の引数に非構造されますあなたは電話している。これは、未知数の引数を渡すことを可能にするものです。警告と


代わり、。

あなたは、関数の呼び出しコンテキストを気にしない場合は、個別に引数を渡すことを除いて、あなたが実際に...代わりに

function consume_data() { 

    do_some(arguments[0]); 

    consume_the_rest.call.apply(consume_the_rest, arguments); 
} 

これを行うことができます。ここ.call()方法はただ.apply()のようなものですコレクションとしてではなくしたがって.call()をと呼びます。.call()の呼び出しコンテキストにconsume_the_restを設定し、を発信し、最初の引数を呼び出しコンテキスト引数.call()として設定し、それ以外の引数は引き渡されます。

あなたがやったかのようにそれはなります...

consume_the_rest.call(arguments[0], arguments[1], ...arguments[n]) 

は...そう、最初の引数は、実際には、呼び出し元のコンテキストとして使用され、残りはあなたが期待するものとなります。

また、呼び出している関数の呼び出しコンテキストについて気にしない場合にのみ、これを実行します。

1

Function.applyを参照してください:

function consume_data() { 
    do_some(arguments.shift()); 
    consume_the_rest.apply(this, args); 
} 
関連する問題