1.请写出下面代码的打印结果
function Foo(){
getName = function(){
console.log(1);
};
console.log(this)//window
return this
}//Foo的构造函数
Foo.getName = function(){
console.log(2)
}//给Foo挂载了直接方法(2)
Foo.prototype.getName = function(){
console.log(3);
}//在Foo原型上挂在了方法
var getName = function(){
console.log(4);
}//存在变量提升
function getName(){
console.log(5)
}//存在函数提升,函数提升在变量提升之上
Foo.getName();//2 执行直接方法
getName();//4 上面的执行顺序:function getName(){console.log(5)};var getName;getName=function(){console.log(4)} 4覆盖了5
Foo().getName();//1 Foo()返回this,相当于this.getName(),全局范围,Foo中的getName未使用let,所以覆盖了4,打印1
getName();//1
2.请写出下面代码的打印结果
function Foo() {
Foo.a = function () {
console.log(1)
}
this.a = function () {
console.log(2)
}
}//是Foo的构造函数,没有产生实例,此刻也没有执行
Foo.prototype.a = function () {
console.log(3)
}//在Foo的原型对象上挂载了方法a
Foo.a = function () {
console.log(4)
}//给构造函数Foo挂载了直接方法a
Foo.a();//4 立刻执行了Foo上的a方法
let obj = new Foo();//调用了FOO的构建方法,把FOO的全局上的直接方法替换掉,输出1,在新对象上挂载直接方法a,输出值为2
obj.a();//3cuo 2 因为有直接方法(this.a),所以不需要去原型链上访问
Foo.a();//1