先看以下代码:

 1         function Foo(){
 2             getName = function(){ alert(1); };
 3             return this;
 4         }
 5         Foo.getName = function(){ alert(2); };
 6         Foo.prototype.getName = function(){ alert(3); };
 7         var getName = function(){ alert(4); };
 8         function getName(){ alert(5) };
 9
10         Foo.getName();
11         getName();
12         Foo().getName();
13         getName();
14         new Foo.getName();
15         new Foo().getName();
16         new new Foo().getName();

怎么样?是不是有点糊涂了。

首先要明确下面一些基本知识:

1、 this的指向只取决于调用的方式,,函数定义里面的this指向全局的window;

  new的过程:新建对象,让this指向它,返回this。

  普通的函数调用时得到的值是return的返回值,new 得到值可能是this也有可能是return 的值,这取决于return后面数据的类型。

2、实例化对象访问一个属性的顺序,先看自身有没有这个属性,再看访问原型里的。
3、new 后面跟的是一个构造函数,则会创建一个对象。如果是一个构造函数的属性名称,那么没有任何作用。

   new 只会和离他最近的()结合

请看下面的一张图:

一开始Foo.getName()为1,第5行代码将它修改为2,所以Foo.getName()的输出为2;

getName() 是全局调用,函数提升优先于变量提升,到了第7行代码getName()被修改为4,所以输出为4;

Foo()是函数调用,得到的是return后面的值this,this指向window,并且第2行代码将getName()修改为1,所以结果为1

同理,getName()的输出也是为1;

new Foo.getName() new没有任何作用,这里是方法调用,输出值为2

new Foo().getName() new和最近的一个()结合,所以得到了一个实例化对象,实例化对象自身没有getName这个属性,所以访问原型里面的getName,为 3

new new Foo().getName() 最前面的new没有任何意义,同上一个

转载于:https://www.cnblogs.com/liuluteresa/p/6516298.html

一道超级复杂的js题目相关推荐

  1. JS题目总结:原型链/new/json/MVC/Promise

    JS题目总结:原型链/new/json/MVC/Promise 1原型链相关 解读: 上图中,Object,Function,Array,Boolean都是构造函数 第一个框: object是实例对象 ...

  2. c语言超级经典400道题目,C语言超级经典400道题目.doc

    C语言超级经典400道题目1.C语言程序的基本单位是____ A) 程序行 B) 语句 C) 函数 D) 字符.C.1 2.C语言程序的三种基本结构是____ A.顺序结构,选择结构,循环结构 B.递 ...

  3. 阿里巴巴Web前端面试的一道JS题目,求解答!!!

    题目大概是这种: function outer(){return inner;var inner = "a";function inner(){};inner = 9; } ale ...

  4. 一道说难不难的js题目

    1.题目 function Foo() {getName = function () { alert (1); };return this; } Foo.getName = function () { ...

  5. JS题目之数组数据拆分重组转成嵌套对象,让脑细胞活跃下

    前言 下班的时候在群里看到一个小伙伴,在群里问了一道js的题,发现没人理会他; 来了兴趣就折腾了下,以下是解答过程,用的是ES6+的特性,在chrome跑的; 有兴趣的小伙伴可以瞧瞧~~谢谢 题目 效 ...

  6. html css js题目

    BFC的布局规则 1.Box垂直方向的距离由margin决定.属于同一个BFC的两个相邻Box的margin会发生重叠. 2.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素 ...

  7. 前端面试经典js题目Foo 与 getName

    面试时遇到了2次该题,结果两次都没有看懂,感觉自己的js功底太差了,跟没学过一样.这道题很经典,网上查了一下,记录一下大佬的思路和自己的理解 题目: function Foo(){getName = ...

  8. 记一道超级简单的 Java 算法面试题,但无人通过

    点击上方蓝字设为星标 下面开始今天的学习- 作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 ...

  9. 记一道超级简单的算法面试题,90%的人没能完整答出来

    作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 Java 算法面试题了. 题目很简单,完成 ...

最新文章

  1. 【PC工具】github项目辅助下载工具,github高速下载
  2. tplink 2.4g弱信号剔除_科普 l 路由器信号2.4G和5G区别
  3. 【kafka】支持超高并发的kafka网络设计
  4. CentOS 7 Linux实时内核下的epoll性能分析后续 | 火焰图分析
  5. Activiti流程定义部署、删除
  6. 百度网盘也能BT下载ED2K
  7. activiti工作流在线表单设计功能(activiti + ueditor + Ueditor Web Form Design扩展 )
  8. 基于 RISC-V SoC 的可配置 FFT 系统设计(10)1024 点 FFT 程序的交叉编译
  9. 5款Java微服务开源框架
  10. 电脑版我的世界java_我的世界pc JAVA版
  11. 日常网页bug页面收集
  12. 常见十大量化投资策略
  13. Centos7下Docker1.12和Docker-CE 17.12添加镜像加速器的区别
  14. 化工原理计算机辅助设计,化工原理课程设计总结与体会
  15. BZOJ2876: [Noi2012]骑行川藏
  16. 新编计算机英语复习(东华理工专业外语)
  17. 检测整数是否含有7 或 是7的倍数
  18. GOOGLE服务地址入口
  19. sdk编译文件报错conflicting types for ‘kill‘
  20. 淘宝店铺订单交易接口/淘宝店铺商品上传接口/淘宝店铺订单解密接口/淘宝店铺订单明文接口/淘宝店铺订单插旗接口代码对接分享

热门文章

  1. Mybatis之占位符与拼接符
  2. 如何记忆英语的成语、俗语等
  3. hdu 4496 并查集 逆向 并查集删边
  4. 谁是谁的first-child
  5. ubuntu12.04 安装中文输入法
  6. (转载)谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。...
  7. 深入浅出数据库设计三范式
  8. 简单的聊聊,顺便招前端
  9. DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
  10. 情怀成驱动力 网游改编手游能火多久?