callとapply

342 名前:Name_Not_Found[] 投稿日:2007/10/10(水) 13:05:02 ID:0D5oBjKl
callとapplyがよくわかりません。理解のためのヒントお願いします。

343 名前:Name_Not_Found[sage] 投稿日:2007/10/10(水) 13:57:44 ID:???
>>342
JavaScriptでは関数を変数に入れておくことができるよね。

var fn = function(s, t) { alert(s+t); };
fn('hello', 'world'); ←呼び出す

しかしこの方法だとオブジェクトのメソッド呼び出しはできない

var obj = new XXX(...);
obj.fn1 = fn; obj.fn1('hello', 'world');

上記のように書き換えてしまえばできるけど書き換えたくないことも。で、

fn.call(obj, 'hello', 'world');

こうすれば任意のオブジェクトをthisとして変数に入っている関数を
メソッドとして呼び出せる。だからまあこれでいいんだけど、場合に
よっては引数列を別の配列として用意したいこともある。そのときは

var args = ['hello', 'world'];
fn.apply(obj, args);

こういう風にapplyの方が適している。callとapplyは呼び方の違いだけ。