下面這道面試題是新鮮出爐,最近一次筆試的時候遇到的,當時直接就懵逼了。git
而後在GitHub上諮詢了mqyqingfeng,很是感謝這位博主對個人耐心解答!!github
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(); new Foo.getName(); new Foo().getName() new new Foo().getName();
第一問Foo.getName()輸出2,不解釋面試
第二問getName()輸出4,由於getName函數聲明會被提早,而後被函數表達式var var getName = function(){console.log(4);}所覆蓋,因此輸出4。函數
第三問Foo().getName()輸出1,當函數Foo()執行完後,函數內的變量getName沒有用關鍵字var定義,此時getName默認指向了window,至關於全局定義的getName再次被覆蓋。而Foo()返回的this也是指向window,因此這一問至關於this.getName(),結果天然就是1了。this
第五問new Foo().getName()輸出3,這一問涉及到函數運算優先級問題,具體參考這裏,new和成員訪問的優先級都爲19,因此這一問至關於(new Foo()).getName();new一個實例後,訪問的方法是prototype上的,因此結果是3prototype