哪位大神給我解釋下走到誤區(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())為何調getName()的值不同
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName();//3
以下解釋場景為全局作用域下,而不是一個函數(shù)體內.成員訪問操作符優(yōu)先級高于new對象實例創(chuàng)建操作符號new操作符的優(yōu)先級高于函數(shù)調用
函數(shù)(除了箭頭函數(shù)和生成器函數(shù))都可以作為構造函數(shù),和new操作符結合使用
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())為何調getName()的值不同
new Foo.getName(); //2 [J]
new Foo().getName(); //3 [K]
new new Foo().getName();//3 [L]
[A] 定義了名Foo的函數(shù)對象,在函數(shù)體內定義了一個名為getName的全局函數(shù)變量
[B] 為函數(shù)對象Foo設置了一個名為getName的屬性,這個屬性指向一個函數(shù)
[C] 為函數(shù)對象Foo的原型對象添加了一個getName屬性,這個屬性指向一個函數(shù)
[D] 定義了一個全局函數(shù)變量getName,指向一個匿名函數(shù),因為變量提升的關系getName申明放到頭部,而變量賦值會留在原地不動
[E] 通過函數(shù)申明的方式定義了一個名為getName,同樣因為提升的關系,函數(shù)聲明將被放到最頂部,實際達到的效果是這個函數(shù)聲明從來沒有出現(xiàn)過
[F] 調用Foo函數(shù)對象的getName方法,也就是是[B]定義的函數(shù),輸出2
[G] 調用[D]定義的函數(shù)變量getName執(zhí)行的函數(shù),輸出 4
[H] 執(zhí)行Foo函數(shù),此時全局函數(shù)變量getName被重新賦值,此時Foo函數(shù)返回的this指向的是全局對象,全局函數(shù)變量getName就是附在其上的,那么在全局對象上執(zhí)行getName方法,輸出 1
[I] 全局函數(shù)變量getName的指向已經通過[H]執(zhí)行被重新賦值了,指向
getName=function(){console.log(1)};//污染了 [A]
輸出 1
[J] new Foo.getName();==>new (Foo.getName)();Foo.getName返回一個函數(shù),通過new操作,此函數(shù)被當做構造函數(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)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。