天天看点

(大家看)一道前端面试题1.开篇2.正文总结

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

继续阅读