一道经典的面试题,下面用a b c d 标注方便讲解

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><script>//a function Foo() {getName = function() {console.log(1);};return this;}//bFoo.getName = function() {console.log(2);};//cFoo.prototype.getName = function() {console.log(3);};//d var getName = function() {console.log(4);};//e function getName() {console.log(5);}Foo.getName(); // 2getName(); // 4Foo().getName(); // 1getName();   // 1new Foo.getName(); // 2new Foo().getName(); // 3new new Foo().getName(); // 3</script>
</body></html>


解析:

1. Foo.getName(); // 2

对象.属性 这里Foo作为函数对象,getName()作为Foo的函数属性,所以看题目b处

2.getName(); // 4

这里主要看题目d e 处,d处为一个函数表达式,e声明了一个函数
两者内容相同,我们可以根据函数优先规则 函数声明>变量
那e处提到题目前面
根据js自上而下运行,先运行题目e处,再把d处赋值给getName,所以覆盖了e处
如下

           //e 声明了一个getName函数let getNamegetName = function() {console.log(5);}//d  函数表达式getName = function() {console.log(4);};

3.Foo().getName(); // 1**

​ 这里看题目a处
​ 因为Foo打了小括号,所以就是调用Foo函数
​ 并且给全局变量getName重新赋值

4.getName(); // 1

​ 因为前面3运行题目a处,给getName赋值了

5. new Foo.getName(); // 2

​ 对象.属性,这里看b处
​ new Foo.getName==new(Foo.getName())
​ 所以这里先调用了Foo.getName,运行结果为2
​ 然后再实例化返回值2

6.new Foo().getName(); // 3

​ 因为Foo打了小括号,所以就是调用Foo函数
​ 并且前面有new,就意味着是用new调用的Foo函数
​ 那么此时相当于是把Foo当做了构造函数
​ 相当于(new Foo()).getName()
​ 所以返回了Foo实例化出来的对象,这个对象自己没有
​ getName方法,所以就访问原型里的getName,既题目c处

7.new new Foo().getName(); // 3

​ 这里可以看做new((new Foo()).getName())
​ 右上可得 new(3)
​ 所有实例化返回值为3


写在最后,都是个人理解,题目讲解方式参照博客大佬排版
https://blog.csdn.net/redatao/article/details/107955687

new Foo().getName()经典面试题相关推荐

  1. JS经典面试题04-原型链Foo.getName

    1.1-答案揭晓 1.2-原理解析 <!DOCTYPE html> <html lang="en"><head><meta charset ...

  2. new new Foo().getName()面试题解析

    经典面试题 Foo().getName() 解析 题目如下,写出输出内容(注释:abcde为步骤标号,便于下边分析定位) // a. function Foo () {getName = functi ...

  3. js中的经典题Foo.getName

    js中的经典题Foo.getName Foo.getName所涉及到的知识点 先看看题目代码: Foo.getName所涉及到的知识点 先看看题目代码: function Foo() { getNam ...

  4. js面试题Foo.getName()的故事

    首先声明下:此题是本人面试时笔试题中的一道,回来一搜居然雷同,纯属偶然,特写此篇来整理一下思绪... 原题: function Foo() {getName = function () { conso ...

  5. Java经典面试题一

    转载自  Java经典面试题一 题目一 面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1.抽象: 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽 ...

  6. C++经典面试题(最全,面中率最高)

    C++经典面试题(最全,面中率最高) 1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与fre ...

  7. 经典面试题(52):以下代码将输出的结果是什么?

    web前端教程 用大白话,来讲编程 我们先来回顾上一题<经典面试题(51)>.看投票结果,正确的答案是选项:C,绝大部分同学选对了! 有疑惑的同学,可以看看下面@方呵呵 和 @弓备 给我们 ...

  8. 经典面试题(36):以下代码将输出的结果是什么?

    web前端教程 用大白话,来讲编程 我们先来回顾上一题<经典面试题(35)>.看投票结果,正确的答案是选项:B,绝大部分同学选对了! 看看下面这2位小伙伴 @弓备 和 @lita 给我们带 ...

  9. 经典面试题(25):以下代码将输出的结果是什么?

    我们先来回顾上一题<经典面试题(24)>.看投票结果,大部分小伙伴都选择了错误的选项! 正确的答案是选项:C ["foo","foo"].为什么是C ...

最新文章

  1. JVM命令查看与设置参数
  2. SQL Server远程部署
  3. 实例54:python
  4. kafka之六:为什么Kafka那么快
  5. 上市之前再被爆出安全问题 卫龙辣条被爆吃出“锁精环”
  6. alibaba/Sentinel 分布式 系统流量防卫兵
  7. groupdel 删除用户组
  8. 2018最新qq的服务器地址,腾讯QQ2018正式版新功能详细介绍
  9. BackgroundWorker类的使用例程
  10. 视频无缝续播的一些解决方案
  11. 【第八期送书活动】+ 购书福利
  12. 继电器分类及性能对比
  13. Qt国际化详细步骤(手把手教你如何国际化)
  14. C# 后台GC 的前因后果
  15. 北京理工大学22计算机考研初试成绩公布了吗?
  16. java数据之头尾链表
  17. 如何在Python中用集合实现随机的1~100的20个数字
  18. GBA的内存其实很大
  19. GitHub 优秀的 Android 开源项目——转自多篇网络文章
  20. 三七互娱后端工程师笔试记录

热门文章

  1. Emacs Stardict
  2. WebRTC-Failed to set remote answer sdp: The order of m-lines in answer doesn‘t match order in offer.
  3. 那些值得一看的数学电影!
  4. 我国电子商务五大发展阶段
  5. 二氧化硅改性活性炭|SiO2改性的V2O5-MoO3/TiO2催化剂|SiO2改性MCM-22分子筛上联苯|纳米SiO2改性环氧涂层海洋腐蚀规律
  6. 应用技术大公开系列Q之十四:(润滑).石墨烯润滑油制备工艺 (*4-2)
  7. 【华为OD统一考试B卷 | 100分】5键键盘(C++ Java JavaScript Python)
  8. Cynthia问题、任务、缺陷管理系统
  9. 物联网发展预期与展望
  10. 用vue去实现百度下拉菜单