function Foo() {
getName = function() {
console.log(1)
};
return this;
}
Foo.getName = function() {
console.log(2)
};
Foo.prototype.getName = function() {
console.log(3)
};
getName() //5
//函数表达式
var getName = function() {
console.log(4)
};
getName() //4
//函数声明式
function getName() {
console.log(5)
};
//关于这里getName()为什么变成4,请先看下面的例子
/*
sayTruth();
function sayTruth() {
alert('I am handsome')
};
var sayTruth = function() {
alert('I am ugly')
};
上面打印的结果为I am is handsome,
因为函数声明式的调用可以在函数声明之前
函数声明提前的时候,函数声明和函数体均提前了。
function sayTruth() {
alert('I am handsome')
};
sayTruth();
var sayTruth = function() {
alert('I am ugly')
};
上面打印的结果为I am handsome,
在函数表达式之前调用是调用的函数声明式的方法
function sayTruth() {
alert('I am handsome')
};
var sayTruth = function() {
alert('I am ugly')
};
sayTruth();
然后在函数表达式后调用是打印的结果为I am ugly,
为什么呢?
函数声明是在预执行期执行的,
就是说函数声明是在浏览器准备执行代码的时候执行的。
因为函数声明在预执行期被执行,
所以到了执行期,函数声明就不再执行了(人家都执行过了自然就不再执行了)
函数表达式覆盖了前面的函数声明,当我们调用sayTruth()函数的时候,
也就是到了代码执行期间,声明会被忽略,
所以自然会输出I am ugly。
*/
getName() //4
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //调用对象方法new不加括号先执行Foo.getName()再执行new--结果:2
getName(); //1
new Foo().getName(); //调用原型方法--结果:3
getName(); //1
new new Foo().getName(); //调用原型方法--结果:3
getName(); //1
new new Foo.getName(); //new后面必须跟构造函数--报错Uncaught TypeError: (intermediate value) is not a constructor