摘自微信公众号
function Foo() {
getName = function() { //这里没var,因此改变的全局变量上的属性!!!
alert(1);
};
return this;
}
Foo.getName = function() {
alert(2);
};
Foo.prototype.getName = function() {
console.log(this);
this.aa = '123';
alert(3);
};
var getName = function() {
alert(4);
};
function getName() { //函数声明会被提前,会被var操作覆盖掉
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
下面一一解释下(个人浅显的理解…)
1. 调用的是Foo函数对象上的getName函数。输出2
2. 全局作用域下的getName,相当于window.getName()。如何判断时输出4而不是5呢?两个都是定义了相同名称的getName,而且function关键字定义的函数还是后面才定义的,应该是覆盖了var定义的函数才对啊?,在JS中,函数的声明和定义将会被提前,也就是说,我可以先使用这个函数,后面才去定义,JS在执行时,将会把doSth()
的定义提前,我们才得以引用函数。变量就不会。因此后面的var关键字定义将提前的function
定义给重置了。
3. 这里粗心的话,很容易得出alert(4)
的结论,仔细一看,Foo函数中定义的getName没有var,因此时一个全局变量,改变了全局的getName,因此输出1
4. 同上,被修改了全局的getName
。
5. 和第一个一样,new的是Foo函数对象上的getName函数
6. 先new Foo()
,然后getName()
,因此调用的时原型链上的getName
7. 先new Foo()
,然后new Foo对象
上的getName
,就是new Foo.prototype.getName()