標籤:
阮一峰大神說:它代表函數運行時,自動產生的一個內部對象,只能在函數內部使用。
this關鍵字雖然會根據環境變化,但是它始終指向的是調用當前函數的那個對象。在JS中調用函數的模式可以分為4種:
1、方法調用模式
當函數被儲存為一個對象的屬性時,它就可以稱為這個對象的方法。當一個方法被調用時,this被綁定到這個對象上。如果調用運算式包含一個提取屬性的動作(.或[]),那麼他被稱為方法調用。例如:
var name="window";
var object={
name:"北落";
sayName:function(){
console.log(this.name);
}
}
object.sayName(); /*北落*/
sayName函數作為對象object的方法調用,所以函數體中的this代表object對象。
2、函數調用模式
當一個函數並非一個對象的屬性時,那麼它就是被當作函數來調用的。在此種模式下,this被綁定為全域對象,在瀏覽器環境下就是window對象。例如:
var name="北落";
function sayName(){
console.log(this.name);
}
sayName(); /*北落*/
sayName以函數模式調用,所以函數體中的this指向的是window對象。
3、建構函式模式
如果在一個函數前面加上new關鍵字來調用,那麼就會建立一個串連到該函數的prototype成員的新對象,同時,this會被綁定到這個新對象上。這種情況下,這個函數就可以成為此對象的建構函式。例如:
function object(){
this.name="北落";
}
var person=new object();
console.log(person.name);
object作為建構函式被調用,函數體內的this被綁定為新建立的對象person。
4、apply調用模式
在JS中,所有函數也是對象,所有函數對象都有兩個方法:apply和call,這兩個方法可以讓我們構建一個參數數組傳遞給調用函數,也允許我們改變this的指向。例如:
var name="北落";
var person={
name:"南落";
};
function sayName(){
console.log(this.name);
}
sayName(); /*北落*/
sayName.apply(person); /*南落*/
sayName.apply(); /*北落*/
當以函數調用模式調用sayName時,this代表window;當用apply模式調用sayName,並給它傳入的第一個參數為person時,this被綁定到person對象上。如果不給apply傳入任何參數,則this代表window。
關於JS中的this關鍵字