this
是JavaScript中的一個關鍵字疟丙。它代表函數(shù)運行時,自動生成的一個內(nèi)部對象重窟,只能在函數(shù)內(nèi)部使用载萌。比如:
function a(){
this.x = 1;
}
隨著函數(shù)使用場合的不同,this
的值會發(fā)生變化,所以要分析this
所在的函數(shù)是當做哪個對象的方法調(diào)用的扭仁,則該對象就是this
所引用的對象可缚。
this
的使用一般有以下四種情況:
普通函數(shù)調(diào)用
普通函數(shù)調(diào)用屬于全局性調(diào)用,this
就代表了全局變量斋枢。
比如:
const x = 1;
function a(){
console.log(this.x);
}
a(); // 輸出為1
此時的this指的就是全局變量global,最后一句其實就等價于
window.a();//輸出為1
對象的方法調(diào)用
在 JavaScript 中知给,函數(shù)也是對象瓤帚,因此函數(shù)可以作為一個對象的屬性,此時該函數(shù)被稱為該對象的方法涩赢,在使用這種調(diào)用方式時戈次,this 被自然綁定到該對象。
const a = {
x : 1,
y : function(x) {
console.log(this.x);
}
};
a.y(0); // 輸出1筒扒,this綁定到當前對象怯邪,即a對象
在這段代碼中,function(x){}
這個函數(shù)就是a對象的一個方法花墩,所以此時的this
就是a
對象悬秉。
構(gòu)造函數(shù)調(diào)用
JavaScript 支持面向?qū)ο笫骄幊蹋c主流的面向?qū)ο笫骄幊陶Z言不同冰蘑,JavaScript 并沒有類的概念和泌,而是使用原型繼承方式。相應的祠肥,JavaScript 中的構(gòu)造函數(shù)也很特殊武氓,如果不使用 new 調(diào)用,則和普通函數(shù)一樣仇箱。一般構(gòu)造函數(shù)以大寫字母開頭县恕,如果調(diào)用正確,this
綁定到新創(chuàng)建的對象上剂桥。
function a(){
this.x = 1;
}
const b = new a();
console.log(b.x); //輸出1
apply調(diào)用
apply()
是函數(shù)對象的一個方法忠烛,它的作用是改變函數(shù)的調(diào)用對象,它的第一個參數(shù)就表示改變后的調(diào)用這個函數(shù)的對象渊额。所以this指的就是這第一個參數(shù)况木。
const x = 0;
const a = {
x : 1,
y : function() {
console.log(this.x);
}
};
a.y.apply(); // 輸出0
apply()
的參數(shù)為空時,默認調(diào)用全局對象旬迹。因此火惊,這時的運行結(jié)果為0,證明this指的是全局對象奔垦。
若將給apply()
傳入?yún)?shù)屹耐,即
a.y.apply(a); // 輸出1
則表明此時的this
指的是對象a
。