call和apply:數組
每一個函數都包含兩個非繼承來的方法:call方法和apply方法,這兩個方法的做用是同樣的。app
都是在特定的做用域中調用函數,等於設置函數體內this對象的值,以擴充函數賴以運行的做用域。通常來講,this總會指向調用某個方法的對象,可是使用call和apply方法時候,就會改變this的指向。函數
call方法使用實例:this
例子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);//blueblog
例子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,結果是Speakwangthree
apply方法使用實例:作用域
例子1:io
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