JS综合面试题

变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级

题目:

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

前两问的答案就显而易见了,关键是后面几个,若没有良好的JS功底不好回答。首先我们先按照浏览器的执行顺序解析一下题目(把变量定义按照优先级顺序提前)如下:

function Foo(){
    getName = function(){
        alert(1);
    }
    return this;
}
function getName(){
    alert(5);
}
var getName;
Foo.getName = function(){
    alert(2);
}
Foo.prototype.getName = function(){
    alert(3);
}
getName= function(){
    alert(4);
}

好了,我们的执行顺序已经和浏览器一样了,这其中要注意:函数声明的优先级是优于变量声明的。

第一问

1.Foo.getName()  //显然这里的执行的是Foo的自有属性,并不是继承属性,因为只有在没有
这个自有属性的时候,才会沿着原型链往上找,因此答案是2,而不是3

第二问

2.getName()  //把上面题目的书写顺序改为JS正常执行的顺序后,可以看到最后一个匿名函数
覆盖了上面的getName,故答案是4

第三问

3.Foo().getName()  //这里是先把Foo执行了一遍,根据上面的函数,Foo()直接调用应返回
window对象,最后的调用表达式就变成了window.getName(),

第四问

第五问

第六问

第七问