一個很是有趣的面試題

  • 下面這道面試題是新鮮出爐,最近一次筆試的時候遇到的,當時直接就懵逼了。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

相關文章
相關標籤/搜索