面试题自学2020-11-5

178 阅读1分钟

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();

getName();

Foo().getName();

getName();

new Foo.getName();

new Foo().getName();

new new Foo().getName();

输出结果依次:

Foo.getName();实际是调用静态变量 Foo.getName ===>输出2

getName();考察的是变量提升,实际执行的代码是:

function Foo() {

getName = function () { alert (1); };

return this;

}

var getName;

function getName() { alert (5);}

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

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

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

========>最后一行getName会覆盖上面的getName,最终输出4

Foo().getName();会首先执行Foo方法,由于Foo方法中getName未先定义,所以会变量提升,执行的代码为:

var getName;

getName = function () { alert (1); };

function Foo() {

return this;

}

Foo方法返回的this指向window,所以实际调用的是window.getName(),最终输出1

getName();调用的也是window.getName(),最终输出1

new Foo.getName() 是调用Foo.getName(),最终输出2

new Foo().getName();考察的是执行顺序,执行的代码是 (new Foo()).getName();new Foo()会产生一个构造函数,Foo返回的this是该实例本身,但是没有对Foo本身的属性做修改,会顺着原型链prototype寻找,最终找到Foo.prototype.getName(),最终输出3

new new Foo().getName();考察的是执行顺序,执行的代码是 new (new Foo()).getName();new Foo()会产生一个构造函数,Foo返回的this是该实例本身,但是没有对Foo本身的属性做修改,会顺着原型链prototype寻找,最终找到Foo.prototype.getName(),最终输出3