うまく引数が渡らない
例えば 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()
と同じ感覚で使える独自ロガーが作成できますね。