var obj = {
hanshu : function (){};
}
var hanshu = obj.hanshu;
/* 調(diào)用hanshu的兩種寫法 */
/*第一種*/
obj.hanshu();
/*第二種*/
hanshu();
雖然obj.shanshu() 和 hanshu()都指向同一個(gè)函數(shù)搁宾,但是執(zhí)行結(jié)果可能就不一樣隆圆。
var obj = {
hanshu : function (){
console.log(this.a)
},
a :8
}
var hanshu = obj.hanshu;
var a = 5;
/* 調(diào)用hanshu的兩種寫法 */
/*第一種*/
obj.hanshu(); // 8
/*第二種*/
hanshu(); //5
兩者都是指向同一個(gè)函數(shù)但是運(yùn)行結(jié)果卻不一樣沾歪,是因?yàn)楹瘮?shù)的執(zhí)行環(huán)境不同,函數(shù)體內(nèi)部使用了this關(guān)鍵字霹粥。對(duì)于obj.hanshu()來(lái)說(shuō),hanshu運(yùn)行在obj環(huán)境疼鸟,所以this指向obj蒙挑;對(duì)于hanshu()來(lái)說(shuō),hanshu運(yùn)行在全局環(huán)境愚臀,所以this指向全局環(huán)境忆蚀。所以矾利,兩者的運(yùn)行結(jié)果不一樣。但是為什么var hasnhu = obj.hanshu馋袜,hanshu()就變成在全局環(huán)境執(zhí)行男旗?
var obj = { a:5 }
javascript會(huì)先在內(nèi)存里面生成一個(gè)對(duì)象:{ a:5 },然后把這個(gè)對(duì)象的內(nèi)存地址賦值給變量obj欣鳖。此時(shí)obj存的就是一個(gè)地址察皇。讀取obj{a:5}就是讀取javascript生成的對(duì)象:{ a:5 }的地址。
上面代碼中泽台,函數(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)境友瘤。
obj.foo()是通過(guò)obj找到foo,所以就是在obj環(huán)境執(zhí)行檐束。一旦var foo = obj.foo辫秧,變量foo就直接指向函數(shù)本身,所以foo()就變成在全局環(huán)境執(zhí)行被丧。