一道JS面试题

摘自微信公众号

        function Foo() {
                getName = function() { //这里没var,因此改变的全局变量上的属性!!!
                    alert(1);
                };
                return this;
            }
            Foo.getName = function() {
                alert(2);
            };
            Foo.prototype.getName = function() {
                console.log(this);
                this.aa = '123';
                alert(3);
            };
            var getName = function() {
                alert(4);
            };

            function getName() {  //函数声明会被提前,会被var操作覆盖掉
                alert(5);
            }
            //请写出以下输出结果:
            Foo.getName();  //2
            getName();      //4
            Foo().getName(); //1
            getName(); //1
            new Foo.getName();  //2
            new Foo().getName(); //3
            new new Foo().getName();  //3  

下面一一解释下(个人浅显的理解…)
1. 调用的是Foo函数对象上的getName函数。输出2
2. 全局作用域下的getName,相当于window.getName()。如何判断时输出4而不是5呢?两个都是定义了相同名称的getName,而且function关键字定义的函数还是后面才定义的,应该是覆盖了var定义的函数才对啊?,在JS中,函数的声明和定义将会被提前,也就是说,我可以先使用这个函数,后面才去定义,JS在执行时,将会把doSth()的定义提前,我们才得以引用函数。变量就不会。因此后面的var关键字定义将提前的function定义给重置了。
3. 这里粗心的话,很容易得出alert(4)的结论,仔细一看,Foo函数中定义的getName没有var,因此时一个全局变量,改变了全局的getName,因此输出1
4. 同上,被修改了全局的getName
5. 和第一个一样,new的是Foo函数对象上的getName函数
6. 先new Foo(),然后getName(),因此调用的时原型链上的getName
7. 先new Foo(),然后new Foo对象上的getName,就是new Foo.prototype.getName()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值