js中的this

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容