一道超级复杂的js题目

布满荆棘的人生 2021-07-05 02:14 461阅读 0赞

先看以下代码:

  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. Foo.getName();
  10. getName();
  11. Foo().getName();
  12. getName();
  13. new Foo.getName();
  14. new Foo().getName();
  15. 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后面的值thisthis指向window,并且第2行代码将getName()修改为1,所以结果为1

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,461人围观)

还没有评论,来说两句吧...

相关阅读

    相关 一道编程题目

    昨天在微信群看到有人在讨论一个问题, 具体题目如下: 入参两个Intger,返回空,然后使这个两个值在调用函数后交换。打印交换后的值,比如你初始化两个变量a和b对应的值