在学习javascript中遇到的问题

前端JavaScript 专栏收录该内容
1 篇文章 0 订阅

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

代码如下:

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一个对象。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值