每日一题-0714

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 new Foo().getName();

以上的输出结果是什么?


1、Foo.getName();//2
解释:这个应该没问题,直接访问原型属性,属性方法返回结果


2、Foo().getName();// 1
解释:执行Foo函数,getName是全局属性,返回的this指向window,相当于执行window.getName(),输出 1


3、getName();//1
解释
一、 先看getName的声明有处,按定义先后顺序:

  • var关键字声明了一个全局getName
  • function关键字声明了一个全局getName
  • Foo构造函数中声明了一个全局getName

二、分析输出结果:

  • var(函数表达式)function(函数声明)都存在变量提升,提升后的结果是这样的
var getName;
function getName () {
  console.log(5);
}
getName = function () {
  console.log(4)
}
// 这时window.getName输出4
  • 上一步执行了Foo(),将window.getName重新定义了,所以getName输出1

4、new Foo.getName();//2
解释: 通过new 来返回一个 Foo.getName 的实例,就相当于Foo.getName是一个构造函数,可以通过以下方法验证

var bar = new Foo.getName();
bar.__proto__.constructor === Foo.getName //true

5、new new Foo().getName();
解释:按照new操作符拆分一下就是new ( (new Foo()).getName )();

var a = new Foo();
var b = a.getName; // a.getName 指向Foo.protoType.getName
new b(); // 3

你可能感兴趣的:(每日一题-0714)