●在瀏覽器中,this指向的是全局對(duì)象(即window):
var foo = "hello";
console.log(this.foo); // hello
console.log(window.foo); // hello
如果你在聲明變量的時(shí)候沒(méi)有使用var或let (ES6)那么這個(gè)變量即為全局變量。
foo = "hello";
function test() {
var foo = "world";
}
console.log(this.foo); //hello
test();
console.log(this.foo); //world
●構(gòu)造函數(shù)
先看兩個(gè)例子:
function foo() {
this.a = 23;
}
var o = new foo();
console.log(o.a); //23
function foo() {
this.a = 23;
return {a: 24};
}
var o = new foo();
console.log(o.a); //24
一開(kāi)始this
指向全局對(duì)象,當(dāng)我們用構(gòu)造器定義變量o
之后,此時(shí)this
的指向就發(fā)生了變化,this
不再指向全局對(duì)象,而是指向構(gòu)造器new出來(lái)的那個(gè)對(duì)象(這里指的是o
)
在第二個(gè)例子中都毒,函數(shù)foo
是有返回值的,且返回值為對(duì)象碰缔,所以構(gòu)造器最后輸出的是默認(rèn)返回的對(duì)象账劲,也就是24
而不是23
●函數(shù)作為對(duì)象的一個(gè)屬性
如果函數(shù)作為對(duì)象的屬性,而且作為對(duì)象的屬性調(diào)用時(shí)金抡,函數(shù)中的this指向該對(duì)象瀑焦。
var obj = {
x: 10,
fn: function() {
console.log(this.x)
}
}
obj.fn();
結(jié)果顯示為
從上面的例子我們可以看到
this
指向了對(duì)象obj
,并且在調(diào)用他的屬性fn()
函數(shù)時(shí)梗肝,成功地返回了x
的值蝠猬。
我們?cè)倏匆欢晤?lèi)似的代碼:
var obj = {
x: 10,
fn: function() {
console.log(this.x)
}
}
var foo = obj.fn;
foo();
結(jié)果會(huì)是10嗎?讓數(shù)據(jù)來(lái)告訴我們答案:
答案是undefined
统捶。為什么會(huì)是醬紫呢榆芦?因?yàn)閠his的指向發(fā)生了變化柄粹,this不再指向?qū)ο?code>obj,而是指向了全局對(duì)象window
,fn()
函數(shù)被賦值到新的對(duì)象foo
上匆绣,而且我們也沒(méi)有將其作為obj
的屬性進(jìn)行調(diào)用,this的指向就會(huì)發(fā)生了變化驻右。
記住一句話就好:this
指向調(diào)用時(shí)所綁定函數(shù)所綁定的對(duì)象!