最近又遇到了JacvaScript中的call()方法和apply()方法释液,而在某些時候這兩個方法還確實是十分重要的,那么就讓我總結這兩個方法的使用和區(qū)別吧艰亮。
1. 每個函數都包含兩個非繼承而來的方法:call()方法和apply()方法闭翩。
都是在特定的作用域中調用函數迄埃,等于設置函數體內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