有好一段時間我對於 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
快一些. 但是別擔心, 基本上你是感覺不出來差異性的. 所以就挑你看的順眼的用吧.