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