this
是JavaScript中的一個關鍵字。它代表函數運行時,自動生成的一個內部對象,只能在函數內部使用。比如:
function a(){
this.x = 1;
}
隨著函數使用場合的不同,this
的值會發生變化,所以要分析this
所在的函數是當做哪個對象的方法調用的,則該對象就是this
所引用的對象。
this
的使用一般有以下四種情況:
普通函數調用
普通函數調用屬于全局性調用,this
就代表了全局變量。
比如:
const x = 1;
function a(){
console.log(this.x);
}
a(); // 輸出為1
此時的this指的就是全局變量global,最后一句其實就等價于
window.a();//輸出為1
對象的方法調用
在 JavaScript 中,函數也是對象,因此函數可以作為一個對象的屬性,此時該函數被稱為該對象的方法,在使用這種調用方式時,this 被自然綁定到該對象。
const a = {
x : 1,
y : function(x) {
console.log(this.x);
}
};
a.y(0); // 輸出1,this綁定到當前對象,即a對象
在這段代碼中,function(x){}
這個函數就是a對象的一個方法,所以此時的this
就是a
對象。
構造函數調用
JavaScript 支持面向對象式編程,與主流的面向對象式編程語言不同,JavaScript 并沒有類的概念,而是使用原型繼承方式。相應的,JavaScript 中的構造函數也很特殊,如果不使用 new 調用,則和普通函數一樣。一般構造函數以大寫字母開頭,如果調用正確,this
綁定到新創建的對象上。
function a(){
this.x = 1;
}
const b = new a();
console.log(b.x); //輸出1
apply調用
apply()
是函數對象的一個方法,它的作用是改變函數的調用對象,它的第一個參數就表示改變后的調用這個函數的對象。所以this指的就是這第一個參數。
const x = 0;
const a = {
x : 1,
y : function() {
console.log(this.x);
}
};
a.y.apply(); // 輸出0
apply()
的參數為空時,默認調用全局對象。因此,這時的運行結果為0,證明this指的是全局對象。
若將給apply()
傳入參數,即
a.y.apply(a); // 輸出1
則表明此時的this
指的是對象a
。