this是 JavaScript 語(yǔ)言的一個(gè)關(guān)鍵字。
fn() this => window/global
obj.fn() this => obj
fn.call(xx) this => xx
fn.apply(xx) this => xx
fn.bind(xx) this => xx
new Fn() this => 新的對(duì)象
fn = ()=> {} this => 外面的 this
它是函數(shù)運(yùn)行時(shí),在函數(shù)體內(nèi)部自動(dòng)生成的一個(gè)對(duì)象,只能在函數(shù)體內(nèi)部使用。
function test() {
this.x = 1;
}
上面代碼中,函數(shù)test運(yùn)行時(shí),內(nèi)部會(huì)自動(dòng)有一個(gè)this對(duì)象可以使用。
那么,this的值是什么呢?
函數(shù)的不同使用場(chǎng)合,this有不同的值??偟膩?lái)說(shuō),this就是函數(shù)運(yùn)行時(shí)所在的環(huán)境對(duì)象。下面分四種情況,詳細(xì)討論this的用法。
情況一:純粹的函數(shù)調(diào)用
這是函數(shù)的最通常用法,屬于全局性調(diào)用,因此this就代表全局對(duì)象。請(qǐng)看下面這段代碼,它的運(yùn)行結(jié)果是1。
var x = 1;
function test() {
console.log(this.x);
}
test(); // 1
情況二:作為對(duì)象方法的調(diào)用
函數(shù)還可以作為某個(gè)對(duì)象的方法調(diào)用,這時(shí)this就指這個(gè)上級(jí)對(duì)象。
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m(); // 1
情況三 作為構(gòu)造函數(shù)調(diào)用
所謂構(gòu)造函數(shù),就是通過(guò)這個(gè)函數(shù),可以生成一個(gè)新對(duì)象。這時(shí),this就指這個(gè)新對(duì)象。
function test() {
this.x = 1;
}
var obj = new test();
obj.x // 1
運(yùn)行結(jié)果為1。為了表明這時(shí)this不是全局對(duì)象,我們對(duì)代碼做一些改變:
var x = 2;
function test() {
this.x = 1;
}
var obj = new test();
x // 2
運(yùn)行結(jié)果為2,表明全局變量x的值根本沒(méi)變。
情況四 apply 調(diào)用
apply()是函數(shù)的一個(gè)方法,作用是改變函數(shù)的調(diào)用對(duì)象。它的第一個(gè)參數(shù)就表示改變后的調(diào)用這個(gè)函數(shù)的對(duì)象。因此,這時(shí)this指的就是這第一個(gè)參數(shù)。
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply() // 0
apply()的參數(shù)為空時(shí),默認(rèn)調(diào)用全局對(duì)象。因此,這時(shí)的運(yùn)行結(jié)果為0,證明this指的是全局對(duì)象。
如果把最后一行代碼修改為
obj.m.apply(obj); //1
運(yùn)行結(jié)果就變成了1,證明了這時(shí)this代表的是對(duì)象obj。
this出現(xiàn)的原因
JavaScript 允許在函數(shù)體內(nèi)部,引用當(dāng)前環(huán)境的其他變量。
var f = function () {
console.log(x);
};
上面代碼中,函數(shù)體里面使用了變量x。該變量由運(yùn)行環(huán)境提供。
現(xiàn)在問(wèn)題就來(lái)了,由于函數(shù)可以在不同的運(yùn)行環(huán)境執(zhí)行,所以需要有一種機(jī)制,能夠在函數(shù)體內(nèi)部獲得當(dāng)前的運(yùn)行環(huán)境(context)。所以,this就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。
var f = function () {
console.log(this.x);
}
上面代碼中,函數(shù)體里面的this.x就是指當(dāng)前運(yùn)行環(huán)境的x。