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(); //2 4 1 1
//new Foo.getName(); new Foo().getName(); new new Foo().getName(); //2 3 3
由于变量提升,上面可以改成这样
function Foo() {
getName = function () {
alert (1);
};
return this;
}
Foo.getName = function () {
alert (2);
};
Foo.prototype.getName = function () {
alert (3);
};
function getName() {
alert (5);
}
var getName = function () {
alert (4);
};
答案记录:
1 Foo.getName();//2
因为函数Foo的属性getName是一个函数,函数内alert(2)
2 getName(); //4
getName函数提升,最后执行的是var getName = function () { alert (4);}
3 Foo().getName(); //1
Foo函数执行,Foo函数中的getName其实就指向全局的getName,被改为alert(1),然后返回的this,指向全局对象,最后返回的是window.getName()或者getName();因为被改为alert(1),所以结果是1
4 getName() //1
上面getName函数已经被改为alert(1);所以结果为1
5 new Foo.getName() //2
当new 与右边的函数紧挨着,函数没有(),这是.的优先级是大于new的,即等于new (Foo.getName())
6 new Foo().getName() //3
当new 和()相邻,其优先级就大于.等于(new Foo()).getName()
7 new new Foo().getName() //3
根据5和6,等于new ((new Foo()).getname())
网友评论