一个非常有趣的面试题

  • 下面这道面试题是新鲜出炉,最近一次笔试的时候遇到的,当时直接就懵逼了。

  • 然后在GitHub上咨询了mqyqingfeng,非常感谢这位博主对我的耐心解答!!

            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了。

  • 第五问new Foo().getName()输出3,这一问涉及到函数运算优先级问题,具体参考这里,new和成员访问的优先级都为19,所以这一问相当于(new Foo()).getName();new一个实例后,访问的方法是prototype上的,所以结果是3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值