うまく引数が渡らない
例えば JavaScript で console.log() に追加で処理を書いた独自ロガーを作る際、 console.log() のように引数はいくらでも書けるようにし、実際に内部ではその引数を console.log() に渡して呼ぶことにします。
ところが、何も考えずに引数をそのまま渡してしまうと、console.log() に単に第一引数に変数を1つ指定した感じになってしまい、想定と違う出力となります。
function myLogger()
{
// なんらかの追加処理
...
// console.log() を呼び出す
console.log(arguments);
}
console.log(1, 2, 3);
-> 1 2 3
(引数がそれぞれ処理されている)
myLogger(1, 2, 3);
-> [1, 2, 3]
(配列1つとして処理されてしまっている)
apply() で引数を横に展開して関数を呼ぶ
そこで、引数が配列で入ってくるオブジェクトである arguments を、配列の順番ごとに第一引数,第二引数,第三引数...のように横に展開させて関数を呼ぶためのメソッド apply() を使います。
function myLogger()
{
// なんらかの追加処理
...
// console.log() を呼び出す
console.log.apply(null, arguments);
}
console.log(1, 2, 3);
-> 1 2 3
(引数がそれぞれ処理されている)
myLogger(1, 2, 3);
-> 1 2 3
(引数がそれぞれ処理されている)
無事、同じ結果になりました。
これで、 console.log() と同じ感覚で使える独自ロガーが作成できますね。