哪位大神給我解釋下走到誤區(qū)了
var Foo=function(){
getName=function(){console.log(1)};//污染了
return this;
}
Foo.getName=function(){console.log(2)};
Foo.prototype.getName=function(){console.log(3)};
var getName=function(){console.log(4)};//被污染為1
function getName(){console.log(5)};
Foo.getName(); //2
getName();//4
Foo().getName();//1
getName();//1
//前幾步我都懂 就是到這最后三步我清楚為什么?
//1、不懂 new Foo后,如果說函數(shù)是對象(Foo ==Foo())為何調(diào)getName()的值不同
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName();//3
以下解釋場景為全局作用域下,而不是一個函數(shù)體內(nèi).
成員訪問操作符優(yōu)先級高于new
對象實例創(chuàng)建操作符號new
操作符的優(yōu)先級高于函數(shù)調(diào)用
函數(shù)(除了箭頭函數(shù)和生成器函數(shù))都可以作為構(gòu)造函數(shù),和new操作符結(jié)合使用
var Foo=function(){
getName=function(){console.log(1)};//污染了 [A]
return this;
}
Foo.getName=function(){console.log(2)};// [B]
Foo.prototype.getName=function(){console.log(3)};//[C]
var getName=function(){console.log(4)};//被污染為1 //[D]
function getName(){console.log(5)};//[E]
Foo.getName(); //2 [F]
getName();//4 [G]
Foo().getName();//1 [H]
getName();//1 [I]
//前幾步我都懂 就是到這最后三步我清楚為什么?
//1、不懂 new Foo后,如果說函數(shù)是對象(Foo ==Foo())為何調(diào)getName()的值不同
new Foo.getName(); //2 [J]
new Foo().getName(); //3 [K]
new new Foo().getName();//3 [L]
[A] 定義了名Foo的函數(shù)對象,在函數(shù)體內(nèi)定義了一個名為getName的全局函數(shù)變量
[B] 為函數(shù)對象Foo設(shè)置了一個名為getName的屬性,這個屬性指向一個函數(shù)
[C] 為函數(shù)對象Foo的原型對象添加了一個getName屬性,這個屬性指向一個函數(shù)
[D] 定義了一個全局函數(shù)變量getName,指向一個匿名函數(shù),因為變量提升的關(guān)系getName申明放到頭部,而變量賦值會留在原地不動
[E] 通過函數(shù)申明的方式定義了一個名為getName,同樣因為提升的關(guān)系,函數(shù)聲明將被放到最頂部,實際達到的效果是這個函數(shù)聲明從來沒有出現(xiàn)過
[F] 調(diào)用Foo函數(shù)對象的getName方法,也就是是[B]定義的函數(shù),輸出2
[G] 調(diào)用[D]定義的函數(shù)變量getName執(zhí)行的函數(shù),輸出 4
[H] 執(zhí)行Foo函數(shù),此時全局函數(shù)變量getName被重新賦值,此時Foo函數(shù)返回的this指向的是全局對象,全局函數(shù)變量getName就是附在其上的,那么在全局對象上執(zhí)行g(shù)etName方法,輸出 1
[I] 全局函數(shù)變量getName的指向已經(jīng)通過[H]執(zhí)行被重新賦值了,指向
getName=function(){console.log(1)};//污染了 [A]
輸出 1
[J] new Foo.getName();
==>new (Foo.getName)();
Foo.getName
返回一個函數(shù),通過new操作,此函數(shù)被當做構(gòu)造函數(shù)處理,函數(shù)執(zhí)行,輸出 2
[K] new Foo().getName();
分解成2步:
第1步 new Foo()
==> someFooInstance
第2步 someFooInstance.getName()
此時的getName函數(shù)為[C]定義的函數(shù)
[L] new new Foo().getName();
==> new (new Foo().getName)();
new Foo().getName
返回的函數(shù)對象體為[C]定義的函數(shù),輸出 3
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務(wù)外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。