题目如下:
function Fun(){
var getName = function(){
console.log(1);
}
return this;
}
Fun.getName = function(){
console.log(2);
}
Fun.prototype.getName = function(){
console.log(3);
}
var getName = function(){
console.log(4);
}
function getName(){
console.log(5);
}
Fun().getName();
getName();
Fun();
new Fun().getName();
new new Fun().getName();
结果:
Fun().getName(); // 4
getName(); // 4
Fun(); // 无输出 返回Window对象
new Fun().getName(); // 3
new new Fun().getName(); // 3
首先明白变量和函数提升, 函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。
// 举例说明 变量和函数提升(懂的自动跳过)
a()
function a() {
console.log(1)
}
var a = function(){
console.log(2)
}
a()
// 输出: 1 , 2
// 执行的代码顺序如下
function a() {
console.log(1)
};
var a;
a() // 输出 1
a = function(){
console.log(2)
}
a() // 输出2
详细解析:
题目中变量提升后的写法(方便李姐)
// getName 变量提升
function getName(){
console.log(5);
}
function Fun(){
var getName = function(){
console.log(1);
}
return this;
}
var getName;
// 属性上添加getName
Fun.getName = function(){
console.log(2);
}
// 原型上添加方法
Fun.prototype.getName = function(){
console.log(3);
}
getName = function(){
console.log(4);
}
Fun().getName();
getName();
Fun();
new Fun().getName();
new new Fun().getName()
1. Fun().getName()
首先执行Fun()时,返回this,这里指向window,相当于 window.getName() , getName最后被
console.log(4) 的函数赋值;
所以输出: 4;
2.getName()
相当于执行 window.getName(), 同上。
输出:4;
3.Fun()
返回this, 当前环境 window
4.new Fun().getName()
这里的执行顺序是 1.先 new Fun() 2.再执行getName()
// 相当于执行
var fn = new Fun()
fn.getName()
执行new Fun() 实例化的对象 后 , getName()方法实会去 Fun构造函数中找,没找到然后会去原型 prototype上去找getName。
这里原型链有该函数,调用
// 搞清楚 如下
function A(){
this.names = "ab"
}
A.names = "kk"
A.prototype.names = "99"
var a = new A()
console.log(a.names) // ab
console.log(A.names) // kk
5.new new Fun().getName()
执行顺序: 1. new Fun() 2. new Fun.prototype.getName()
// 相当于执行
var Fn1 = new Fun()
var Fn2 = Fn1.getName
new Fn2()