js经典面试题之getName

此题涉及的知识点:声明提升和提升优先级、构造函数返回值问题、js运算符优先级、实例化对象的属性访问优先级、逻辑运算符运算

var Foo = function(){
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
        new new Foo().getName(); //3

(2) 第二个getName();直接调用getName函数一个是函数表达式,一个是函数声明,由于var存在变量提升并且函数声明也会提前
所以7-10行相当于
var getName;
function getName(){}
getName = function(){};

故函数声明覆盖了getName();但后面的getName又覆盖了函数声明
(3)先执行Foo函数,然后调用Foo函数的返回值this指向全局变量,覆盖刚刚的alert(4)
故现在getName的值为alert(1) ,(4)如上所示
(5)new Foo.getName()考察js的运算符优先级问题
new (Foo.getName) ();
实际上是调用Foo构造函数的getName函数
(6)new Foo().getName()
相当于(new Foo()).getName()实例化Foo,this指向本身,本身构造函数没有getName属性,去找原型对象中的getName
(7)new new Foo().getName()相当于new ((new Foo()).getName)();
先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new

上一篇:NavigationBar的显隐和颜色设置


下一篇:如何解决VMware-vmx.exe无法彻底删除的问题