(大家看)一道前端面试题

1.开篇

1.1本文目标

记录一道面试时碰到的题目,题目已经很久,但很经典。

2.正文

2.1代码

 1         function Foo() {
 2             getName = function () { console.log (1); };
 3             return this;
 4         }
 5         Foo.getName = function () { console.log (2);};
 6         Foo.prototype.getName = function () { console.log (3);};
 7         var getName = function () { console.log (4);};
 8         function getName() { console.log (5);}
 9  
10        //以下输出值为多少?
11        Foo.getName(); 
12        getName();
13        Foo().getName();
14        getName();
15        new Foo.getName();
16        new Foo().getName();
17        new new Foo().getName();

2.2解释

(1)Foo.getName(),输出2,第5行向Foo中定义getName,所以输出2

(2)getName(),输出4,由于声明提前,所以最终结果是第7行。

(3)Foo().getName(),输出1,首先Foo()返回this,所以Foo().getName()调用的是全局的getName,但是执行Foo()的时候第2行把全局的getName改了,所以最终输出的是1。

(4)getName(),输出1,由于上一句把全局改了,所以这里也是输出1。

(5)new Foo.getName(),输出2,这是因为new的对象是Foo里面的getName,new的时候会执行对象内部的语句,所以会输出2。

(6)new Foo().getName(),输出3,这次new的对象是Foo,返回的是原型链上的东西,也就是第6行,所以调用getName()也就会输出3。

(7)new new Foo().getName(),输出3,首先执行的是第二个new,对象是Foo,返回Foo的原型,然后执行第一个new,这时new的对象是Foo原型上的getName,new的时候执行getName里面的语句,所以会这里会输出3。

总结

继续努力!

转载于:https://www.cnblogs.com/ChenYongHao/p/7790061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值