摘要:返回值對象指代的是調(diào)用這個函數(shù)的對象,在這里相當于,則相當于而的已經(jīng)被賦值為,所以結(jié)果就為。
做過很多前端筆試題,有些題看起來簡單,就是讀程序?qū)懡Y(jié)果,但要么做錯,要么對答案不確定,這里找到一道比較綜合的題目
function Foo() { //定義了一個名叫Foo的函數(shù) getName = function () { alert (1); }; //(1)函數(shù)內(nèi)定義了一個函數(shù)變量 return this; } Foo.getName = function () { alert (2);}; //(2)創(chuàng)建了Foo的靜態(tài)屬性 Foo.prototype.getName = function () { alert (3);}; //(3)定義了Foo函數(shù)原型對象上的getName函數(shù) var getName = function () { alert (4);}; //(4)通過函數(shù)變量表達式定義了一個叫getName的函數(shù) function getName() { alert (5);} //(5)聲明了一個getName函數(shù) //請寫出以下輸出結(jié)果: Foo.getName(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); new new Foo().getName();
第一題:
Foo.getName(); //2 Foo.getName; // function(){alert(2);}
這道題比較簡單,F(xiàn)oo函數(shù)上的getName函數(shù),執(zhí)行的是第(2)句
第二題:
getName(); //4
我多次做這道題都會認為答案是5,其實不然。
因為變量聲明提升,所以(4)拆分成兩句,var getName; getName = function(){alert(3);}
其中var getName函數(shù)表達式被提升,但getName = function(){alert(3);}則不提升,(5)函數(shù)聲明function getName同樣提升,結(jié)果順序就變?yōu)?/p>
function Foo() { getName = function () { alert (1); }; return this; } var getName; //變量聲明提升 function getName () {alert(5);}; //變量聲明提升,getName()的結(jié)果為alert(5) Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; getName = function () { alert (4);}; //覆蓋了getName()的結(jié)果
因此,getName()的結(jié)果為4.
第三題
Foo().getName(); //1
先執(zhí)行Foo()函數(shù),再調(diào)用其返回值對象的getName屬性函數(shù)。
(1)句沒有var聲明,就先在Foo()里尋找getName聲明,沒有找到,就在外層作用域中尋找,在第(4)句找到了var getName,將此變量的值賦值為function(){alert(1);}。
Foo()返回值對象this指代的是調(diào)用這個函數(shù)的對象,在這里相當于window,則Foo().getName()相當于window.getName(),而window的getName()已經(jīng)被賦值為function(){alert(1);},所以結(jié)果就為1。
Foo.getName和Foo().getName的區(qū)別
function Foo(){ var getName = "Zoe"; } Foo.getName; //undefined Foo().getName; //"Zoe"
第四題
getName(); //相當于調(diào)用window.getName(),結(jié)果為1
第五題
new Foo.getName(); //2
成員訪問運算符(.)的優(yōu)先級大于new,小括號()的優(yōu)先級又大于(.)
所以問題改寫成
new (Foo.getName)();相當于把getName當做構(gòu)造函數(shù)在執(zhí)行
第六題
new Foo().getName(); //3
同樣因為優(yōu)先級,改寫成
(new Foo()).getName(); var f = Foo(); f.getName();
首先構(gòu)建了一個Foo函數(shù)的實例化對象,再調(diào)用對象的getName屬性,由于Foo構(gòu)造函數(shù)沒有添加getName屬性,所以向上查找到原型對象,即(3)句,得到結(jié)果3
我犯過的一個錯誤,將(1)看成Foo函數(shù)的屬性,其實不是的,那只是函數(shù)體內(nèi)的一個變量,只能在函數(shù)體內(nèi)訪問,如果要表示函數(shù)屬性,需要寫成this.getName
第七題
new new Foo().getName(); //3
改寫成
new ((new Foo()).getName)(); var f = new Foo(); var x = f.getName; new x();
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80483.html
摘要:好吧,我承認太標題黨了,這篇文章是通過一道前端面試題引出的純技術討論。我先要矯情無比的從中外詩歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對象的修改與當前循環(huán)保持一致。 好吧,我承認太標題黨了,這篇文章是通過一道前端面試題引出的純技術討論。我先要矯情無比的從中外詩歌說起。 傳統(tǒng)的佛學經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
摘要:好吧,我承認太標題黨了,這篇文章是通過一道前端面試題引出的純技術討論。我先要矯情無比的從中外詩歌說起。這一星期陸陸續(xù)續(xù)面試了不少于個人,其中不乏工作履歷突出的候選者。這樣做的問題在于循環(huán)并沒有要求枚舉對象的修改與當前循環(huán)保持一致。 好吧,我承認太標題黨了,這篇文章是通過一道前端面試題引出的純技術討論。我先要矯情無比的從中外詩歌說起。 傳統(tǒng)的佛學經(jīng)典里,被世人熟知的有這樣一句話:一花一世...
摘要:去公司面試前端,給了一套題,一看,大體上不會,跟面試官說這題對我有些難,他說這是基礎,你可以走了,于是我走了。回來查了才知道原來數(shù)組就有方法。一查我再掩面而泣,原來里就帶了就可以干這活。 去XX公司面試前端,給了一套題,一看,大體上不會,跟面試官說這題對我有些難,他說這是基礎,你可以走了,于是我走了。人艱不拆啊。 但是作為一個知錯就改的好少年,我要發(fā)揚不懂就問,不懂就去研究的優(yōu)良傳統(tǒng)...
摘要:直接開始題目是厲害了說句實話開發(fā)中誰寫成這樣保證會被打死。不過面試就是面試,有面試官的考量點。官方是這么說的。結(jié)果完美,不過小姐姐的意思是數(shù)組的方法會自動觸發(fā)數(shù)組的。 直接開始題目是 if(a==1 && a==2 && a==3){ alert(厲害了) } 說句實話開發(fā)中誰寫成這樣保證會被打死。 不過面試就是面試,有面試官的考量點。 我理解的點有兩個 1、隱式類型轉(zhuǎn)換 先說...
閱讀 924·2023-04-25 19:17
閱讀 2222·2021-09-10 11:26
閱讀 1927·2019-08-30 15:54
閱讀 3451·2019-08-30 15:53
閱讀 2706·2019-08-30 11:20
閱讀 3432·2019-08-29 15:12
閱讀 1256·2019-08-29 13:16
閱讀 2412·2019-08-26 12:19