先上個(gè)代碼例子,再說(shuō)我不理解的地方,求指點(diǎn),謝謝!
var name="window";
var obj={
name:'netease',
print1:()=>{
console.log(this.name);
}
}
obj.print1();//window
es6
中的this
是定義時(shí)綁定,跟運(yùn)行時(shí)無(wú)關(guān),我很納悶就是這個(gè)例子中,定義時(shí) print1
方法里面的this
不是應(yīng)該最先查找到的就是obj
里面的name
嗎,為什么輸出是window
,還是綁定到全局變量上去了?不是明明print1
里面沒(méi)有this
,再查找外圍this
,先找到的應(yīng)該是obj
中的this
嗎?
解決方案:
var name="window";
var obj= {
name : 'netease',
that : this,
print1: function(){ //函數(shù)包裹
return ()=>{
console.log(this.name);
}
},
print2: ()=>{
console.log(this.name);
}
}
console.log(obj.that); // window
obj.print1()(); // netease
obj.print2(); // window
其實(shí)很容易看的。
普通函數(shù)的 this 是動(dòng)態(tài)的,所以要在運(yùn)行時(shí)找擁有當(dāng)前上下文的對(duì)象。
而箭頭函數(shù)的 this 是靜態(tài)的,也就是說(shuō),只需要看箭頭函數(shù)在什么函數(shù)作用域下聲明的,那么這個(gè) this 就會(huì)綁定到這個(gè)函數(shù)的上下文中。即“穿透”箭頭函數(shù)。
例子里的箭頭函數(shù)并沒(méi)有在哪個(gè)函數(shù)里聲明,所以 this 會(huì) fallback 到全局/undefined
箭頭函數(shù)對(duì)this的綁定是強(qiáng)制性,優(yōu)先級(jí)最高的而且不可更改的,簡(jiǎn)單理解就是直接使用了詞法作用域,按照詞法作用域來(lái)理解就不會(huì)出錯(cuò),不用再理會(huì)那些復(fù)雜的this規(guī)則。
你的例子里的this就相對(duì)于指向了當(dāng)前函數(shù)所在的詞法作用域,也就是全局作用域,自然就是window。
如果不知道什么是詞法作用域的話,換句話說(shuō),你直接寫下面這樣,效果也是一樣的。
var name="window";
var obj={
name:'netease',
print1:()=>{
console.log(name);
}
}
obj.print1();
箭頭函數(shù)是本身沒(méi)有執(zhí)行的上下文,沒(méi)有本身的this 是找離他最近的一個(gè)執(zhí)行環(huán)境作為執(zhí)行上下文,最近的this作為它的this 在這里,是window
可以試試以下代碼 把var name="window"去掉
var obj={
name:'netease',
print1:()=>{
console.log(this.name);
}
}
obj.print1();//結(jié)果是undifined
再試試以下代碼
var obj={
name:'netease',
print1:function(){//不用箭頭函數(shù),this指向obj對(duì)象本身
console.log(this.name);
}
}
obj.print1();//結(jié)果是netease
謝邀。
下面這句話引自《深入理解ES6》
箭頭函數(shù)沒(méi)有 this/super/arguments/new.target 的綁定,這些值是由外圍最近一層非箭頭函數(shù)決定。
箭頭函數(shù)的this
和普通函數(shù)的this
可以看成完全兩個(gè)概念的東西,不用傳統(tǒng)的this去理解。
我對(duì)外圍
的理解是,這個(gè)外圍指的是()=>{}
整體的外圍,比如你的代碼中:name屬性的外圍是什么?print1的外圍是什么?。所以 ()=>{console.log(this.name);}
的外圍已經(jīng)出了obj,從而進(jìn)入window
可以借助我下面的代碼來(lái)理解:
var name = "window";
var obj = {
name: 'netease',
print1: () => {
console.log(this.name);
},
print3: function () {
return ()=>{
console.log(this.name);
}
}
}
obj.print1();// window
obj.print3()();// netease 注意是返回閉包函數(shù)
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
浪潮集團(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)突出、引人入勝。
曾工作于聯(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é)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。