call()和apply()都是在特定的作用域中調用函數,等于設定函數體内this對象的值,以擴充函數賴以運作的作用域。
一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時,就會改變this的指向。
function fun(){
console.log(this);
}
fun();
- 上面,當我們調用fun()函數的時候, this的指向是window
function fun(){
console.log(this);
}
var obj1={
type:"我是obj1",
sayName:function(){
console.log(this.type);
}
};
var obj2={
type:"我是obj2"
};
/*this 永遠是window*/
fun(obj1);
/*this是傳入的參數*/
fun.call(obj1);
fun.apply(obj2);
/*正常對象裡的方法 this 指向上級function*/
obj1.sayName();
/*指定參數 this指向傳入的參數*/
obj1.sayName.apply(obj2);
</script>
-
列印結果:
Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
{type: “我是obj1”, sayName: ƒ}
{type: “我是obj2”}
我是obj1
我是obj2
- 說明: fun()預設this指向window, 當我們在調用fun使用call/apply()方法,并且向方法裡面傳遞一個參數的時候, this的指向就會發生變化, 指向到傳遞過來的參數對象。
call()和apply()方法除了傳遞對象之外, 還可以傳遞函數形參,括号裡第一個是要傳遞的對象, 後面的是函數需要的參數。call()和apply()的寫法不同, call(obj,xx,xx,xx) 。 apply(obj,[xx,xx,xx])。
function fun(a,b,c){
console.log(this);
console.log(a+b+c);
}
var obj1={
type:"我是obj1"
};
fun.call(obj1,2,3,4);
-
運作結果:
{type: “我是obj1”}
9