js經(jīng)典面試題01

function Foo() {
    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);
};
function getName() {
    console.log(5);
}

//請寫出以下輸出結(jié)果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

由于經(jīng)常有人拿這個面試提問所以整理了一下保存起來

解析:

1、Foo.getName(); //2

Foo是一個函數(shù),也可以說是一個對象,所以它也可以掛載一些屬性和方法。
所以結(jié)果執(zhí)行的是Foo對象的一個叫做getName()的屬性,而1、4、5中的getName都是作為函數(shù)存在,所以可以排除1、4、5

剩下兩個中,2是Foo對象自身的屬性,3是Foo對象原型鏈上的屬性,而自身屬性的優(yōu)先級高于原型鏈上的屬性,所以執(zhí)行結(jié)果是2


2、getName(); //4

結(jié)果執(zhí)行的是getName函數(shù),而題目代碼中有3個相關(guān)函數(shù),分別是1、4、5

1中的getName是定義在Foo函數(shù)中的函數(shù),由于Foo尚未執(zhí)行,因此它沒有暴露出來,無法被外部調(diào)用,可以排除

4和5都可以被正常調(diào)用,關(guān)鍵在調(diào)用先后問題

由于5是普通函數(shù)(優(yōu)先級最高),4是匿名函數(shù);js解析時會將5提前至最上方優(yōu)先解析,而后面解析的4會將5覆蓋,所以執(zhí)行結(jié)果是4


3、Foo().getName(); //1

結(jié)果執(zhí)行的是Foo函數(shù),F(xiàn)oo函數(shù)中有個返回值是this;this被普通函數(shù)調(diào)用后,指向的對象一定是window對象,所以此處的結(jié)果已經(jīng)可以解析為window.getName(),即調(diào)用getName()函數(shù),所以最后執(zhí)行的就是window.getName,所以輸出1;


4、getName(); //1

在上面已經(jīng)更改全局的getName,執(zhí)行g(shù)etName即是執(zhí)行window.getName;所以依然是1


5、new Foo.getName(); //2

new 操作符在實(shí)例化構(gòu)造器的時候,會執(zhí)行構(gòu)造器函數(shù),也就是說,foo.getName會執(zhí)行,輸出2


6、new Foo().getName(); //3

new操作符的優(yōu)先級較高,所以會先new foo()得到一個實(shí)例,然后再執(zhí)行實(shí)例的getName方法,這個時候,實(shí)例的構(gòu)造器里沒有g(shù)etName方法,就會執(zhí)行構(gòu)造器原型上的getName方法


7、new new Foo().getName(); //3

先執(zhí)行new foo()得到一個實(shí)例,然后在new 這個實(shí)例的getName方法,這個時候會執(zhí)行這個方法,所以輸出3


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,692評論 19 139
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,681評論 1 32
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,823評論 18 399
  • 【壹】 最近一直有些凌亂的生活節(jié)奏,突然在這個午后睡不著的時間里,想靜下來想一想了。不久以前有個好習(xí)慣,寫一些類似...
    mellisa_901閱讀 449評論 1 3
  • 因?yàn)橛辛巳撕?,所以相遇便成了意外。初秋九月,天空依稀晴朗,大地綠意依然,秋風(fēng)不時地吹起,透著習(xí)習(xí)涼意……景色依舊...
    易安言閱讀 225評論 0 2

友情鏈接更多精彩內(nèi)容