Javascript call 以及 apply

有好一段時間我對於 call 以及 apply 總是一知半解. 不但不知道何時可以用到他也分不清楚兩者有什模差異.

基本上 call 以及 apply 都是去執行這個 function 並將這個 function 的 context 替換成第一個參數帶入的物件. 兩個主要的不同是 call 必須將 function 的參數一一帶入而用 apply 的話只要在第二個參數帶入一個陣列就可以了.

function fn( arg1, arg2,... ){
  // do something
}

fn( arg1, arg2,... );

fn.call( context, arg1, arg2,... );

fn.apply( context, [ arg1, arg2,... ]);

第二個參數不是必須的


一個比較趨近現實使用方式的案例

Ajax 是一個很適合拿來用 call 以及 apply 的地方.

function Album( id, title, owner_id ){
  this.id       = id;
  this.name     = title;
  this.owner_id = owner_id;
};

Album.prototype.get_owner = function( callback ){
  var self = this;

  $.get( '/owners/' + this.owner_id , function( data ){
    callback && callback.call( self, data.name );
  });
};

var album = new Album( 1, 'node.js conf', 2 );

album.get_owner( function( owner ){
  alert( 'The album' + this.name + ' belongs to ' + owner );
});

速度

call 來執行的 function 稍稍微比用 apply 快一些. 但是別擔心, 基本上你是感覺不出來差異性的. 所以就挑你看的順眼的用吧.


Related posts