先上個代碼例子,再說我不理解的地方,求指點(diǎn),謝謝!
var name="window";
var obj={
name:'netease',
print1:()=>{
console.log(this.name);
}
}
obj.print1();//window
es6
中的this
是定義時綁定,跟運(yùn)行時無關(guān),我很納悶就是這個例子中,定義時 print1
方法里面的this
不是應(yīng)該最先查找到的就是obj
里面的name
嗎,為什么輸出是window
,還是綁定到全局變量上去了?不是明明print1
里面沒有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 是動態(tài)的,所以要在運(yùn)行時找擁有當(dāng)前上下文的對象。
而箭頭函數(shù)的 this 是靜態(tài)的,也就是說,只需要看箭頭函數(shù)在什么函數(shù)作用域下聲明的,那么這個 this 就會綁定到這個函數(shù)的上下文中。即“穿透”箭頭函數(shù)。
例子里的箭頭函數(shù)并沒有在哪個函數(shù)里聲明,所以 this 會 fallback 到全局/undefined
箭頭函數(shù)對this的綁定是強(qiáng)制性,優(yōu)先級最高的而且不可更改的,簡單理解就是直接使用了詞法作用域,按照詞法作用域來理解就不會出錯,不用再理會那些復(fù)雜的this規(guī)則。
你的例子里的this就相對于指向了當(dāng)前函數(shù)所在的詞法作用域,也就是全局作用域,自然就是window。
如果不知道什么是詞法作用域的話,換句話說,你直接寫下面這樣,效果也是一樣的。
var name="window";
var obj={
name:'netease',
print1:()=>{
console.log(name);
}
}
obj.print1();
箭頭函數(shù)是本身沒有執(zhí)行的上下文,沒有本身的this 是找離他最近的一個執(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對象本身
console.log(this.name);
}
}
obj.print1();//結(jié)果是netease
謝邀。
下面這句話引自《深入理解ES6》
箭頭函數(shù)沒有 this/super/arguments/new.target 的綁定,這些值是由外圍最近一層非箭頭函數(shù)決定。
箭頭函數(shù)的this
和普通函數(shù)的this
可以看成完全兩個概念的東西,不用傳統(tǒng)的this去理解。
我對外圍
的理解是,這個外圍指的是()=>{}
整體的外圍,比如你的代碼中:name屬性的外圍是什么?print1的外圍是什么?。所以 ()=>{console.log(this.name);}
的外圍已經(jīng)出了obj,從而進(jìn)入window
可以借助我下面的代碼來理解:
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)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(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),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jī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ù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(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)師。