JS中的call()方法和apply()方法用法總結

最近又遇到了JacvaScript中的call()方法和apply()方法释液,而在某些時候這兩個方法還確實是十分重要的,那么就讓我總結這兩個方法的使用和區(qū)別吧艰亮。

1. 每個函數都包含兩個非繼承而來的方法:call()方法和apply()方法闭翩。

2. 相同點:這兩個方法的作用是一樣的。

都是在特定的作用域中調用函數迄埃,等于設置函數體內this對象的值疗韵,以擴充函數賴以運行的作用域。

一般來說调俘,this總是指向調用某個方法的對象伶棒,但是使用call()和apply()方法時,就會改變this的指向彩库。

call()方法使用示例:

? ??????//例1

? ? ? ? window.color = 'red';

? ? ? ? document.color = 'yellow';

? ? ? ? var s1 = {color: 'blue' };

? ? ? ? function changeColor(){? ? ? ? ? ??

????????????console.log(this.color);

? ? ? ? }

? ? ? ? changeColor.call();? ? ? ? //red (默認傳遞參數)? ? ? ??

????????changeColor.call(window);? //red? ? ? ? ????????

????????changeColor.call(document); //yellow? ? ? ?

?????????changeColor.call(this);? ? //red? ? ? ? ????????

? ? ? ? ?changeColor.call(s1);? ? ? //blue? ?

? ? //例2? ? var Pet = {

? ? ? ? words : '...',

? ? ? ? speak : function(say){? ? ? ? ? ??

????????????console.log(say + ''+ this.words)

? ? ? ? ????}

? ? ????}

? ? ????Pet.speak('Speak'); // 結果:Speak...? ??

????????var Dog = {

? ? ? ? ????words:'Wang'? ??

????????}

? ? //將this的指向改變成了Dog? ? Pet.speak.call(Dog, 'Speak'); //結果: SpeakWang


apply()方法使用示例:


? ??????//例1

? ? ? ? window.number = 'one';

? ? ? ? document.number = 'two';

? ? ? ? var s1 = {number: 'three' };

? ? ? ? function changeColor(){? ? ? ? ? ??

????????????console.log(this.number);

? ? ? ? }

? ? ? ? changeColor.apply();? ? ? ? //one (默認傳參)? ? ? ??

????????changeColor.apply(window);? //one? ? ? ??

????????changeColor.apply(document); //two? ? ? ?

?????????changeColor.apply(this);? ? //one? ? ? ??

????????changeColor.apply(s1);? ? ? //three? ?

? ? //例2? ? functionPet(words){? ? ? ??

? ? ? ? ? ? ?this.words = words;

? ? ? ? this.speak = function(){? ? ? ? ? ??

????????????????console.log( this.words)

? ? ? ? ????}

? ? ????}

? ? functionDog(words){? ? ? ? //Pet.call(this, words); //結果: Wang? ? ??

?????????????Pet.apply(this, arguments); //結果: Wang? ??

????}

? ? var dog = new Dog('Wang');

? ? dog.speak();


不同點:接收參數的方式不同。

apply()方法?接收兩個參數先蒋,一個是函數運行的作用域(this)骇钦,另一個是參數數組。

語法:apply([thisObj [,argArray] ]);竞漾,調用一個對象的一個方法眯搭,2另一個對象替換當前對象。

說明:如果argArray不是一個有效數組或不是arguments對象业岁,那么將導致一個?

TypeError鳞仙,如果沒有提供argArray和thisObj任何一個參數,那么Global對象將用作thisObj笔时。

call()方法?第一個參數和apply()方法的一樣棍好,但是傳遞給函數的參數必須列舉出來。

語法:call([thisObject[,arg1 [,arg2 [,...,argn]]]]);,應用某一對象的一個方法借笙,用另一個對象替換當前對象扒怖。

說明:?call方法可以用來代替另一個對象調用一個方法,call方法可以將一個函數的對象上下文從初始的上下文改變?yōu)閠hisObj指定的新對象业稼,如果沒有提供thisObj參數盗痒,那么Global對象被用于thisObj。

使用示例1:

? ??????functionadd(c,d){?

?????????????return this.a + this.b + c + d;

? ? ????}

? ? ????var s = {a:1, b:2};

? ? ????console.log(add.call(s,3,4)); // 1+2+3+4 = 10? ??

????????console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末低散,一起剝皮案震驚了整個濱河市俯邓,隨后出現的幾起案子,更是在濱河造成了極大的恐慌熔号,老刑警劉巖稽鞭,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異跨嘉,居然都是意外死亡川慌,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門祠乃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梦重,“玉大人,你說我怎么就攤上這事亮瓷∏倥。” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵嘱支,是天一觀的道長蚓胸。 經常有香客問我,道長除师,這世上最難降的妖魔是什么沛膳? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮汛聚,結果婚禮上锹安,老公的妹妹穿的比我還像新娘。我一直安慰自己倚舀,他們只是感情好叹哭,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痕貌,像睡著了一般风罩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舵稠,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天超升,我揣著相機與錄音入宦,去河邊找鬼。 笑死廓俭,一個胖子當著我的面吹牛云石,可吹牛的內容都是我干的。 我是一名探鬼主播研乒,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼汹忠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雹熬?” 一聲冷哼從身側響起宽菜,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竿报,沒想到半個月后铅乡,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡烈菌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年阵幸,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽世。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡挚赊,死狀恐怖,靈堂內的尸體忽然破棺而出济瓢,到底是詐尸還是另有隱情荠割,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布旺矾,位于F島的核電站蔑鹦,受9級特大地震影響,放射性物質發(fā)生泄漏箕宙。R本人自食惡果不足惜嚎朽,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柬帕。 院中可真熱鬧火鼻,春花似錦、人聲如沸雕崩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盼铁。三九已至,卻和暖如春尝偎,著一層夾襖步出監(jiān)牢的瞬間饶火,已是汗流浹背鹏控。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肤寝,地道東北人当辐。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鲤看,于是被迫代替她去往敵國和親缘揪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容