变量定义提升、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(),