ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

apply,callメソッド

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として扱われるオブジェクトを渡して使う方法はどんな場合があるのだろう。オブジェクトを渡して使う汎用的なユーティリティー関数とか?