一个很是有趣的面试题

  • 下面这道面试题是新鲜出炉,最近一次笔试的时候遇到的,当时直接就懵逼了。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

相关文章
相关标签/搜索