在学习javascript中遇到的问题

最近开始打算好好学习前端知识,从前端知识攻克。在一个前端群中见到了这样一个题,自己没有回答正确,特别来记下来,总结经验。

代码如下:

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
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3

getName()执行的时候存在预编译的概念,在腾讯课堂中渡一教育的JavaScript教程就讲的很细,大家可以去看看,说多了像打广告,就不多说了。

function getName(){}这是函数声明,在预编译时会被提到最前面执行。然后在执行到var getName = function(){}的时候,实际只是执行了函数赋值,就是定义getName也是在预编译的时候提到最前面执行了。所以此时getName()这个函数的内容是console.log(4)。

执行Foo()时,使用console.log(Foo())它输出的是Window,也就是说它返回的this是全局的,所以这时getName()是存在全局中的,Foo()里面的getName()就把getName()进行了更改,后面再执行getName()是输出的就是1了。

Foo.getName()是一个函数,使用new 函数会生成一个对象,这个对象的构造函数是Foo.getName()。

new new Foo().getName()我的理解是先执行new Foo()生成一个对象,然后去使用该对象的getName()方法作为构造函数,再new一个对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值