* call()とapply() [#q5687226]

** call() [#bc574ce1]
 function func(v) {
   alert( v + this.name );
 }
 func('hello, ');

↑ではthis.nameが参照出来ないが、

 var obj  = { name : 'Taro' };
 var func = function (v) { alert( v + this.name ); };
 func.call(obj, 'Hello, ');

↑のようにcall()を使うと任意のオブジェクト({ name : 'taro' })に対して関数(func())を実行できる。この際、オブジェクトには何の変更もない。
↑のようにcall()を使うと任意のオブジェクト { name : 'taro' } に対して関数 func() を実行できる。この際、オブジェクトには何の変更もない。
これを別の方法で実装すると、

 var obj  = { name : 'Taro' };
 obj.func = function (v) { alert( v + this.name ); };
 obj.func('Hello. ');
 delete obj.func;

となる。

** apply() [#dc1e7f08]
apply()は第2引数を配列で取り(['Hello, ','Mr.'])、適用される関数には引数を並べて渡す(v1,v2)。
 var obj  = { name : 'Taro' };
 var func = function (v1, v2) { alert( v1 + v2 + this.name ); };
 func.apply(obj, [ 'Hello, ', 'Mr.' ]);

これはcall()でも以下のようにして実装出来る。

 var obj = { name : 'Taro' };
 var func = function (v1, v2) { alert( v1 + v2 + this.name ); };
 func.call( obj, 'Hello, ','Mr.' );

引数は省略して、argumentsを利用しても良い。
 var obj    = { name : 'Taro' };
 var func   = function () { alert( arguments[0] + arguments[1] + this.name ); };
 var caller = function () { func.apply( obj, arguments ) };
 caller( 'Hello, ','Mr.' );

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS