javascriptのapply呼び出しについて
apply呼び出しは、ある関数を全く別のオブジェクトの関数として呼び出す関数で、callとの違いは匹数をargumentsで指定できること、とこの前勉強した。こちらの記事など参考になりました。
applyの利用方法 | JavaScript capsule
しかし、例えばこんなコード
function applyVer(f){ return function (){ var result = f.apply(this,arguments); return result; } } var evenApply = applyVer(function(x){ return x % 2 === 0; }); console.log([2,4,6].every(evenApply)); // -> true
この場合、applyVerの中のthisは普通の関数呼び出しなのでWindowオブジェクトになってます。
f(arguments)とした場合でもfは Windowオブジェクトのメソッドとして実行されるので、argumentを匹数にできるから変わらんじゃないの?と思っていました。しかし試しに下記のように実行してみると結果が違います。
function applyVer(f){ return function (){ var result = f.apply(this,arguments); return result; } } function directVer(f){ return function (){ var result = f(arguments); return result; } } var even_base = function(x){ return x % 2 === 0; }; var evenApply = applyVer(even_base); var evenDirect = directVer(even_base); console.log([2,4,6].every(evenApply)); // -> true console.log([2,4,6].every(evenDirect)); // -> falseデバグモードにして変数の挙動を見てみると、evenApplyの時は意図した通り、even_baseの引数xには2,4,6という数値が入っているのですが、evenDirectの場合はArray型のオブジェクトになっていて、2,4,6はその配列の要素として扱われていました。 よく考えれば当然ではあるんですが、apply呼び出しした場合はargumentsのArrayをそのまま渡すのではなくそれをうまく分解して、argument内の配列が引数として適用された場合と同じようにしてくれている、ということですね。 こう文章にしてみても、このあたり言葉だけでは分かりにくいですね…