剖析一道變態(tài)的阿里面試題

本題旨在深刻了解原型、面向?qū)ο?、運(yùn)算符優(yōu)先級的綜合考查。

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)
}
Foo.getName()
getName()
Foo().getName()
getName()
new Foo.getName()
new Foo().getName()
new new Foo().getName()

思維導(dǎo)圖:

解析:

  • 先函數(shù)提升,加載了 function Foo, function getName,此時 getName 輸出5,然后加載 var getName,覆蓋了前面的 getName,此時 getName 輸出4。
  • 接著執(zhí)行代碼Foo.getName(),直接輸出2。
  • 執(zhí)行 getName(),輸出4。
  • 執(zhí)行 Foo().getName(),先執(zhí)行 Foo(),使得 getName 輸出1,返回的 this 是 window。所以 this.getName() 就是全局的 getName,輸出1。
  • 執(zhí)行 getName(),輸出1。
  • 執(zhí)行 new Foo.getName()new Foo().getName(),根據(jù)運(yùn)算符優(yōu)先級,函數(shù)調(diào)用…(…)的優(yōu)先級是19,成員訪問 . 是19,帶參數(shù)列表的 new 是19,無參列表的 new 是18。所以 new Foo.getName() 先執(zhí)行 Foo.getName(),輸出2。new Foo().getName() 從左到右依次執(zhí)行,new Foo() 相當(dāng)于創(chuàng)建實例 xxx,實例的 getName() 方法要從原型上去找,因此 xxx.getName() 輸出3。
  • 執(zhí)行 new new Foo().getName(),從最后一個 new 開始,new Foo() 得到實例xxx,然后相當(dāng)于 new xxx.getName(),屬于無參列表的 new,先執(zhí)行 xxx.getName(),輸出3。

因此,答案是:2 4 1 1 2 3 3。

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

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