apply()與call()的區(qū)別

JavaScript中的每一個Function對象都有一個apply()方法和一個call()方法,它們的語法分別為:

/*apply()方法*/
function.apply(thisObj[, argArray])

/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);

它們各自的定義:

apply:調(diào)用一個對象的一個方法镐确,用另一個對象替換當前對象瓜晤。例如:B.apply(A, arguments);即A對象應(yīng)用B對象的方法锥余。

call:調(diào)用一個對象的一個方法,用另一個對象替換當前對象痢掠。例如:B.call(A, args1,args2);即A對象調(diào)用B對象的方法驱犹。

它們的共同之處:

都“可以用來代替另一個對象調(diào)用一個方法,將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛蓆hisObj指定的新對象”足画。

它們的不同之處:

apply:最多只能有兩個參數(shù)——新this對象和一個數(shù)組argArray雄驹。如果給該方法傳遞多個參數(shù),則把參數(shù)都寫進這個數(shù)組里面锌云,當然荠医,即使只有一個參數(shù),也要寫進數(shù)組里桑涎。如果argArray不是一個有效的數(shù)組或arguments對象彬向,那么將導(dǎo)致一個TypeError。如果沒有提供argArray和thisObj任何一個參數(shù)攻冷,那么Global對象將被用作thisObj娃胆,并且無法被傳遞任何參數(shù)。

call:它可以接受多個參數(shù)等曼,第一個參數(shù)與apply一樣里烦,后面則是一串參數(shù)列表。這個方法主要用在js對象各方法相互調(diào)用的時候禁谦,使當前this實例指針保持一致胁黑,或者在特殊情況下需要改變this指針。如果沒有提供thisObj參數(shù)州泊,那么 Global 對象被用作thisObj丧蘸。

實際上,apply和call的功能是一樣的遥皂,只是傳入的參數(shù)列表形式不同力喷。

示例代碼:

(1)基本用法

function add(a,b){
  return a+b;  
}
function sub(a,b){
  return a-b;  
}
var a1 = add.apply(sub,[4,2]);  //sub調(diào)用add的方法
var a2 = sub.apply(add,[4,2]);
alert(a1);  //6     
alert(a2);  //2

/*call的用法*/
var a1 = add.call(sub,4,2);
(2)實現(xiàn)繼承
```javascript
function Animal(name){
  this.name = name;
  this.showName = function(){
        alert(this.name);    
    }    
}

function Cat(name){
  Animal.apply(this,[name]);    
}

var cat = new Cat("咕咕");
cat.showName();

/*call的用法*/
Animal.call(this,name);

(3)多重繼承

function Class10(){
  this.showSub = function(a,b){
        alert(a - b);
    }   
}

function Class11(){
  this.showAdd = function(a,b){
        alert(a + b);
    }  
}

function Class12(){
  Class10.apply(this);
  Class11.apply(this);   
  // Class10.call(this);
  //Class11.call(this);  
}

var c2 = new Class12();
c2.showSub(3,1);    //2
c2.showAdd(3,1);    //4

apply的一些其他巧妙用法

(1)Math.max 可以實現(xiàn)得到數(shù)組中最大的一項:

因為Math.max不支持Math.max([param1,param2])也就是數(shù)組刽漂,但是它支持Math.max(param1,param2...),所以可以根據(jù)apply的特點來解決 var max=Math.max.apply(null,array)弟孟,這樣就輕易的可以得到一個數(shù)組中的最大項(apply會將一個數(shù)組轉(zhuǎn)換為一個參數(shù)接一個參

數(shù)的方式傳遞給方法)

這塊在調(diào)用的時候第一個參數(shù)給了null贝咙,這是因為沒有對象去調(diào)用這個方法,我只需要用這個方法幫我運算拂募,得到返回的結(jié)果就行庭猩,所以直接傳遞了一個null過去。

用這種方法也可以實現(xiàn)得到數(shù)組中的最小項:Math.min.apply(null,array)

(2)Array.prototype.push可以實現(xiàn)兩個數(shù)組的合并

同樣push方法沒有提供push一個數(shù)組没讲,但是它提供了push(param1,param2...paramN)眯娱,同樣也可以用apply來轉(zhuǎn)換一下這個數(shù)組,即:

var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6");
Array.prototype.push.apply(arr1,arr2);    //得到合并后數(shù)組的長度爬凑,因為push就是返回一個數(shù)組的長度

也可以這樣理解徙缴,arr1調(diào)用了push方法,參數(shù)是通過apply將數(shù)組轉(zhuǎn)換為參數(shù)列表的集合

通常在什么情況下嘁信,可以使用apply類似Math.max等之類的特殊用法:

一般在目標函數(shù)只需要n個參數(shù)列表于样,而不接收一個數(shù)組的形式,可以通過apply的方式巧妙地解決這個問題潘靖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末穿剖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卦溢,更是在濱河造成了極大的恐慌糊余,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单寂,死亡現(xiàn)場離奇詭異贬芥,居然都是意外死亡,警方通過查閱死者的電腦和手機宣决,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門蘸劈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尊沸,你說我怎么就攤上這事威沫。” “怎么了洼专?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵棒掠,是天一觀的道長。 經(jīng)常有香客問我屁商,道長句柠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任棒假,我火速辦了婚禮溯职,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帽哑。我一直安慰自己谜酒,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布妻枕。 她就那樣靜靜地躺著僻族,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屡谐。 梳的紋絲不亂的頭發(fā)上述么,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音愕掏,去河邊找鬼度秘。 笑死,一個胖子當著我的面吹牛饵撑,可吹牛的內(nèi)容都是我干的剑梳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼滑潘,長吁一口氣:“原來是場噩夢啊……” “哼垢乙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起语卤,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤追逮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粹舵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钮孵,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年齐婴,在試婚紗的時候發(fā)現(xiàn)自己被綠了油猫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡柠偶,死狀恐怖情妖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诱担,我是刑警寧澤毡证,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蔫仙,受9級特大地震影響料睛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一恤煞、第九天 我趴在偏房一處隱蔽的房頂上張望屎勘。 院中可真熱鬧,春花似錦居扒、人聲如沸概漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓤摧。三九已至,卻和暖如春玉吁,著一層夾襖步出監(jiān)牢的瞬間照弥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工进副, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留这揣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓敢会,卻偏偏與公主長得像曾沈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸥昏,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容