下面这道面试题是新鲜出炉,最近一次笔试的时候遇到的,当时直接就懵逼了。
然后在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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。