为了账号安全,请及时绑定邮箱和手机立即绑定

几处代码不知是否理解正确?

几处代码不知是否理解正确?

红颜莎娜 2019-03-12 20:16:50
function Foo(){            getName=function(){alert(1);}            console.log(this)            return this;        }            Foo.getName=function(){alert(2);}            Foo.prototype.getName=function(){alert(3);}            var getName=function(){alert(4);}            function getName(){alert(5);}Foo.getName(); //2 这里是不是因为构造函数Foo中的getName方法没有this关键字,所以就不是1,而是直接采用外部的方法,意思就是Foo对象调用getName的时候弹出2??getName(); //4Foo().getName(); //1 这里为什么是1呢?是因为Foo返回了this对象,这里的this对象是window,所以这句话的意思不是应该等同window.getName()??那应该是4啊为什么是1getName(); // 1 这里变成1 是不是因为3的那一步Foo返回了this对象,所以改变了全局函数getName??所以返回1new Foo.getName();//2new Foo().getName(); //3new new Foo().getName(); //35-7不是很理解,解释不出原因。5是不是new关键字其实没起什么作用呢?都只是调用一个方法而已?
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

Foo.getName(); //2

直接调用Foo自己的方法,而不是Foo对象的方法。Foo自己的方法是alert(2)那个,所以弹出2。

getName(); //4

这个没什么好说的,函数声明提升。

Foo().getName(); //1

这个就比较微妙了。仔细看Foo函数,它的getName没有用var声明,所以这个getName实际上是window的,所以window的getName会被重新赋值。而它最后又返回了this,由于没有用new调用,所以这里的this是window。

综上,最终弹出的是1。

getName(); // 1

上一步把window的getName重新赋值了,所以这里弹出1。

new Foo.getName();//2

这里的new没有任何作用。因为Foo没有加括号,所以它实际上是先调用Foo.getName(),弹出2,然后再去new它的返回结果,也就是undefined。

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

这个加了括号,所以是先new一个Foo对象,再去调它的getName方法。Foo对象自身没有getName方法,去它的原型上去找,也就是弹出3的那个。

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

最前面的new没意义,实际执行的时候是这样的:new (new Foo().getName()),括号里的与前一条相同,最后的返回值为undefined,所以最前面那个new没有实际意义。


查看完整回答
反对 回复 2019-03-25
  • 2 回答
  • 0 关注
  • 370 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信