伝統的な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])
は...そう、最初の引数は、実際には、呼び出し元のコンテキストとして使用され、残りはあなたが期待するものとなります。
また、呼び出している関数の呼び出しコンテキストについて気にしない場合にのみ、これを実行します。