js中的call方法和apply方法總結


call和apply:

每個函數都包含兩個非繼承來的方法: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');
var Dog = {
words:'wang'
}
Pet.speak.call(Dog,'Speak')//將this的指向改成了Dog,結果是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

同:

window.number = 'one';
document.number='two';
var s1={number:'three'};
function changeColor(){
console.log(this)
return this.number;
}
console.log(changeColor());//one
console.log(changeColor(window));//one
console.log(changeColor(document));//two
console.log(changeColor(this));//one
console.log(changeColor(s1));//three

這兩個的區別是改變了this的指向。函數里面用了return的話,則在調用的時候就需要把他執行出來,並沒有打印出來。但是上例子是可以打印的,因為函數里面有了打印的消息。

例子2:

function pet(words){
this.words = words;
this.speak = function(){
console.log(this.words)
}
}
function Dog(words){
pet.call(this,words)//wang
pet.apply(this,arguments)//wang
}
var dog = new Dog('wang')
dog.speak();

3.不同點:接收參數的方式的不同

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

語法:apply([thisobj [,argArray]]);調用一個對象的一個方法,另個對象替換當前對象。

說明:如果argArray不是一個有效數組或不是arguments對象,那樣將導致一個typeError,如果沒有提供argArray和thisObj任何一個參數,那個Global對象將用作thisObJ.

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

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

call方法可以用來代替另一個對象調用方法,call方法可以將一個函數的對象上下文從初始的上下文改變為thisObject制定的新對象。如果沒有提供thisObject參數,那個Global對象唄用於thisObject

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM