每日面试题

这篇博客探讨了JavaScript中的函数调用方式,包括Foo.getName()、Foo().getName()、getName()、new Foo.getName()以及new new Foo().getName()。文章详细解释了不同调用如何影响作用域和返回值,涉及函数内部的变量定义、原型链以及构造函数的应用。重点讨论了this关键字在不同上下文中的指向问题和函数调用的优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每日两道 面试题

20210825 面试题
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();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

参考答案

1.Foo.getName();

  • 调用的是Foo的静态方法, 所以 , 打印2

2.Foo().getName()

  • Foo() 就是普通函数调用, 返回的thiswindow,后面调用的window.getName(),而window下的**getName()Foo()中调用被getName()**重新赋值, 所以打印1

3.getName()

  • 在执行过Foo().getName() 的时候, 把window下的getName() 覆盖了, 所以打印的是1,
  • 如果getName() 放在Foo().getName 之前执行, 那么getName() 打印的就是4了。

4.new Foo.getName()

构造器私有属性的getName(),所以打印3

5.new Foo().getName();

  • 原型上的getName(), 所以打印3

6.new new Foo().getName();

  • 首先new Foo() 得到一个 空对象{}
  • 第二步 向空对象中添加一个属相 getName,值为一个函数
  • 第三步 new {}.getName();
  • 等价于 var bar = new (new Foo().getName)(); console.log(bar)
  • 先执行new Foo 得到的实例对象中得getName方法,
    再将这个原型上getName方法当做构造函数 继续new
    所以执行原型上的方法, 打印3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值