Effective JavaScript Item 21は、可変パラメータリストに入るために、appy方法で関数を呼び出します.


このシリーズはEffective JavaScriptの読書ノートとして使われています.
 
以下は可変パラメータリストを持つ方法の典型例である.
average(1, 2, 3); // 2
average(1); // 1
average(3, 1, 4, 1, 5, 9, 2, 6, 5); // 4
average(2, 7, 1, 8, 2, 8, 1, 8); // 4.625
次の例は一つの配列だけをパラメータとして受け入れる例です.
averageOfArray([1, 2, 3]); // 2
averageOfArray([1]); // 1
averageOfArray([3, 1, 4, 1, 5, 9, 2, 6, 5]); // 4
averageOfArray([2, 7, 1, 8, 2, 8, 1, 8]); // 4.625
言うまでもなく、可変パラメータリストを持つ方法はより簡潔で柔軟であり、任意の多くのパラメータを扱うことができる.しかし、パラメータが配列の場合、変数のリストを持つ方法はどうやって呼び出されますか?
 
答えは内蔵のappy方法を使用しています.この方法はcall方法と非常に似ています.apply方法を除いては、配列をパラメータとして受け入れています.そして、この配列の各オブジェクトを個別のパラメータとして呼び出します.同時に、apply方法の最初のパラメータは、call方法の最初のパラメータと同じ意味で、thisの指向性を指定します.したがって、appy方法と組み合わせると、配列タイプのパラメータを処理できます.
var scores = getAllScores();
average.apply(null, scores);
scoresが3つの要素を持つ配列であると仮定すると、上記の呼び出しは実際には次のようなものである.
average(scores[0], scores[1], scores[2]);
別の例は、appyをargments変数に依存する方法に適用することであり、argments変数の意味と使い方については、Item 22を参照してください.
var buffer = {
	state: [],
	append: function() {
		for (var i = 0, n = arguments.length; i < n; i++) {
			this.state.push(arguments[i]);
		}
	}
};
apped方法は任意の多くのパラメータを用いて呼び出すことができます.これは実装においてargments変数に依存しているからです.
buffer.append("Hello, ");
buffer.append(firstName, " ", lastName, "!");
buffer.append(newline);
appyメソッドを使用して、このように呼び出すことができます.
buffer.append.apply(buffer, getInputStrings());
注意したいのは、applyを呼び出したときに、appndの実装にthis変数に依存して、この依存性を明示的に伝えてこそ、修正が正しいオブジェクトに発生したことを保証することができるからである.
 
まとめ:
appy方法を使用して、配列タイプのパラメータを可変パラメータリストを受け入れる方法に入力する.
appy方法の最初のパラメータを使用して、thisの指向性を指定します.