Foo.getName()的输出问题

本文详细解析了JavaScript中函数调用与命名冲突的问题。通过示例代码展示了Foo函数内部、外部以及构造函数调用时getName方法的不同行为,解释了作用域、原型链和变量提升等概念在其中的影响。理解这些机制对于深入掌握JavaScript至关重要。
摘要由CSDN通过智能技术生成
<script>
  function Foo() {
    getName = function () { alert(1); };
    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

  getName();//4

  Foo().getName();//1

  getName();//1

  new Foo.getName();//2

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


</script>

Foo.getName()

<script>
  function Foo() {
    getName = function () { alert(1); };
    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
  
</script>

这个很简单就是简单的调用问题,找到Foo函数执行里面的getName


getName()

<script>
  function Foo() {
    getName = function () { alert(1); };
    return this;
  }

  Foo.getName = function () { alert(2); };

  Foo.prototype.getName = function () { alert(3); };

  var getName = function () { alert(4); };

  function getName() { alert(5); }

  //请写出以下输出结果:

  getName();//4

</script>

全局上面有两个getName,首先 变量提升 getName=underfind 然后 function getName(){} (不执行) 由于这些都存储在栈里面所以先执行function getName()这里是5然后执行 var getName=function 这里输出4 (var getName=function会覆盖function getName(){}


Foo().getName()

<script>
  function Foo() {
    getName = function () { alert(1); };
    return this;
  }

  Foo.getName = function () { alert(2); };

  Foo.prototype.getName = function () { alert(3); };

  var getName = function () { alert(4); };

  function getName() { alert(5); }

  //请写出以下输出结果:
  Foo().getName();//1

</script>

这里先执行Foo()函数,Foo函数里面 return 了this,这里没有人调用Foo所以this指向Window,注意 :Foo()里面没有声明而是直接用getName所以getName是挂在在window上面的,这里输出1


getName()

在这里插入图片描述

这里的getName跟上次是不一样的,因为当调用Foo().getName()这个的时候在window上面就出现了getName 这个吧之前的getName都给覆盖了所以输出1


new Foo.getName()

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

  Foo.getName = function () { alert(2); };

  Foo.prototype.getName = function () { alert(3); };

  var getName = function () { alert(4); };

  function getName() { alert(5); }

  //请写出以下输出结果:
   new Foo.getName();//2

这里有一个js的优先级 ()的优先级最大所以应该执行的是 new (Foo.getName)() 执行全局的Foo.getName输出2


new Foo().getName()

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

  Foo.getName = function () { alert(2); };

  Foo.prototype.getName = function () { alert(3); };

  var getName = function () { alert(4); };

  function getName() { alert(5); }

  //请写出以下输出结果:
  new Foo().getName();//3

这里有两个运算符().()运算符优先级是最大的所以执行newFoo() 这里的this就指向他的实例了而不是window,然后执行实例的getName(),这里注意Foo函数里面的getName()是挂载在window上面的,而他的实例并没有getName(),所以去他的原型链去找,也就是执行Foo.prototype.getName = function () { alert(3); };输出3


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万事胜意sy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值