var b=25;
var a={
b:20,
func: function(){
return this.b;
}
}
console.log(( a. func)())//20
console.log(( a. func, a.func)())//25我覺得應(yīng)該都是25啊。。
@kikong 已經(jīng)說的比較完整了,我來補(bǔ)充下:
抽象下代碼,這樣好分析
var a = {
func: function() {
console.log(this);
}
};
a.func();//1、a
(a.func)(); //2、 a
(a.func, a.func)(); //3、 window;
(a.func = a.func)(); // 4、window;
這里其實(shí)就是 this 的指向問題;
1、在方法調(diào)用(如果某個(gè)對(duì)象的屬性是函數(shù),這個(gè)屬性就叫方法,調(diào)用這個(gè)屬性,就叫方法調(diào)用)中,執(zhí)行函數(shù)體的時(shí)候,作為屬性訪問主體的對(duì)象和數(shù)組便是其調(diào)用方法內(nèi) this 的指向。通俗的說,調(diào)用誰的方法 this 就指向誰;)
2、雖然加上括號(hào)之后,就好像只是在引用一個(gè)函數(shù),但 this 的值得到了維持,因?yàn)?a.func() 和 (a.func()) 的定義時(shí)相同的,按照 kikong 所說,就是 ()不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來就對(duì)拿到的reference執(zhí)行調(diào)用,此時(shí)的this還是a對(duì)象。
3、4、其實(shí)一樣,逗號(hào)運(yùn)算符、賦值運(yùn)算符都返回一個(gè)值,也就是保存在內(nèi)存中的函數(shù)本身,所以 this 的值不能得到維持,這是因?yàn)?/p>
this 對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this 等于window(瀏覽器非嚴(yán)格模式,嚴(yán)格模式是 undefined)
上面四個(gè)明白了,上面的題目就解開了;this 更多了解 戳這
這里有個(gè)引申,按照上面的邏輯,所有返回值操作的,都有可能去改變上面代碼中的 this 值,都需要謹(jǐn)慎,譬如
var a = {
func: function() {
return this;
}
};
function f(fn) {
console.log(fn());
}
f(a.func);//window
因?yàn)楹瘮?shù)中的參數(shù)也是按照值傳遞的,在向參數(shù)傳遞引用類型的值時(shí),會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量。
一個(gè)很簡單的原則判斷this指向:誰調(diào)用的指向誰
console.log(( a. func)())
a調(diào)用的func所以this就是a,即this.b就是a.b,所以this.b等于20
console.log(( a. func, a.func)())
//轉(zhuǎn)換成下面這兩句
var c = a.func
console.log(c())
在瀏覽器里這個(gè)就相當(dāng)于window調(diào)用的c(),所以this指向window,即this.b就是window.b,由于var b = 25,b變成全局變量(window.b)所以this.b等于25
var b=25;
var a={
b:20,
func: function(){
return this.b;
}
}
console.log(( a. func)())//20 A
console.log(( a. func, a.func)())//25我覺得應(yīng)該都是25啊。。 B
這里涉及到2個(gè)運(yùn)算符的問題,分組運(yùn)算符,逗號(hào)運(yùn)算符
分組運(yùn)算符對(duì)于其中的表達(dá)式運(yùn)算結(jié)果為reference類型的-引用類型的,不會(huì)執(zhí)行取值操作
逗號(hào)運(yùn)算符對(duì)其中的每一個(gè)表達(dá)式的都會(huì)執(zhí)行取值操作,并且返回最有一個(gè)表達(dá)式的值作為最終的計(jì)算結(jié)果
那么對(duì)于 A 語句
(a.func)();
的左邊括號(hào)就是個(gè)分組運(yùn)算符,a.func屬性訪問表達(dá)式返回一個(gè)reference,分組運(yùn)算符不對(duì)拿到的引用執(zhí)行解引用操作,也就不取出實(shí)際指向的函數(shù)對(duì)象,還在a對(duì)象的環(huán)境下,接下來就對(duì)拿到的reference執(zhí)行調(diào)用,此時(shí)的this還是a對(duì)象。這個(gè)和
var p=a.func;
p();
不同的,賦值運(yùn)算符會(huì)對(duì)a.func求值。獲取函數(shù)對(duì)象,進(jìn)而賦值給p。p調(diào)用,this為為全局對(duì)象
對(duì)于 A 語句
(a.func, a.func)();
逗號(hào)運(yùn)算符,對(duì)a.func都會(huì)取出實(shí)際指向的函數(shù)對(duì)象,返回這個(gè)函數(shù)對(duì)象。右邊的括號(hào)為一個(gè)函數(shù)調(diào)用操作符,此時(shí)的this為全局對(duì)象。
代碼改成如下也是同樣的結(jié)果
(1, a.func)();
對(duì)于引用和解應(yīng)用,另一個(gè)操作符delete會(huì)給出更好的理解
delete a.func;
delete操作符下,a.func的運(yùn)算結(jié)果是返回一個(gè)reference而不是函數(shù)對(duì)象。也就是delete的不是指向的函數(shù)對(duì)象而是a.func本身
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。