• 追加された行はこの色です。
  • 削除された行はこの色です。
* call()とapply() [#q5687226]

** call() [#bc574ce1]
 function func(v) {
   alert(v + this.name);
 }
 func('hello, ');
↑ではthis.nameが参照出来ないが、
 var func = function (v) {alert(v + this.name);};
 func.call({name:'taro'}, 'hello. ');
↑のようにcall()を使うと任意のオブジェクト({name:'taro'})に対して関数(func())を実行できる。この際、オブジェクトには何の変更もない。これを別の方法で実装すると、
 var obj = {name:'taro'};
 obj.func = function () {alert(v + this.name);};
 obj.func('hello. ');
 var obj = { name:'Taro' };
 var func = function (v) { alert(v + this.name); };
 func.call(obj, 'Hello, ');
↑のように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.');



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS