分享一道有点难度的前端面试题

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(); //  打印:2  函数 对象的 getName
// 普通函数 和函数表达式的区别 普通函数 有提升的作用 最后被重名的 函数表达式 给覆盖掉 最后打印 4 都是window对象中的getName
getName();
// 函数 没有实例化 里面的 this指向window 
// 函数体内部 定义 了全局函数 getName  前面没有var关键字 就是 全局 函数  这个getName 又把上面的getName给覆盖了 打印 1
Foo().getName(); 
getName(); // 这个还是 上面的那个全局getName函数 还是打印1  


new Foo.getName(); // 这里这个new  关键字 用来实例对象的   这里是来迷惑人的 还是 打印   2  
new Foo().getName();  // 这样 Foo() 函数中this就指向了实例化对象 所以应该是原型对象中getName方法  打印出来3
new new Foo().getName();
// 这个我还特意整隔个对象 两次new了下 没啥变化
// 第二次new的是前一个实例的副本  但是原型链还是存在的
//这个打印出来的 还是祖先的 getName 除非后代实例 原型重写了他  这个也算是迷惑人吧	
//答案:
//  2,4,1,1;2,3,3
发布了196 篇原创文章 · 获赞 66 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yunchong_zhao/article/details/104543630