JavaScriptには関数にapplyとcallというメソッドが定義されている。形式は次のとおり。
func.apply(thisArg[, argsArray]) func.call(thisArg[, arg1[, arg2[, …]]])
funcは任意の関数で、thisArgがfunc内でthisとして扱われるオブジェクト。argsArrayは引数として渡したい値の配列。applyが引数を配列として渡すもので、callは引数を1つずつ指定するもの。
本に載っていたサンプルコードでは、ある関数に渡された引数をそのまま別の関数に渡すときに使っていた。
例えば、test0関数からtest1関数に渡すときは次のような感じ。
var test0 = function() { test1.apply(null, arguments); }
これでtest0に渡された引数がそのままtest1に渡される。
実際に試してみたコードがこちら。
var test0 = function() { document.write("test0 "); var max = arguments.length; document.write(max); document.write("<br/>"); for(var i=0; i<max; ++i) { document.write(arguments[i]); document.write("<br/>"); } }; var test1 = function() { document.write("test1<br/>"); test0.apply(null,arguments); test0.call(null, arguments[0],arguments[1]); }; test1(123,456,789);
実行結果は次のとおり。
test1 test0 3 123 456 789 test0 2 123 456
いまいちどういうときに使われると有効なのか分かっていない。引数を渡すのに使えるのは分かったけど、第1引数のthisArgでthisとして扱われるオブジェクトを渡して使う方法はどんな場合があるのだろう。オブジェクトを渡して使う汎用的なユーティリティー関数とか?