考点:函数和类、原型链、运算符优先级、作用域、变量提升
解析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>funciton</title>
</head>
<body>
<script>
function Foo() {
getName = function () {
console.log(1);
};
return this;
}
Foo.getName = function () {
console.log(2);
}
Foo.prototype.getName = function () {
console.log(3);
}
var getName = function () {
console.log(4);
}
function getName() {
console.log(5);
}
Foo.getName(); //2
// 在js中函数本身也是一个对象,是对象就可以声明方法
getName(); //4
// 这个点考察变量提升,相当于如下
// var getName;
// function getName() {
// console.log(5);
// }
// 下面的赋值会覆盖掉上面的函数声明
// getName = function () {
// console.log(4);
// }
Foo().getName(); //1
// 返回的this指的window对象,而getName因变量提升是一个全局变量
// 相当于window.getName()
getName(); //1
// 在上一环节中,getName已经被重新赋值
new Foo.getName(); //2
// .的优先级高于new
// 相当于 new function () { console.log(2); } ();
new Foo().getName(); //3
// 先运算 . 左边的部分
// new Foo() 是一个对象
// 这个上实例上有getName方法
new new Foo().getName(); //3
// 相当于 new foo.getName()
// 调用实例下面的方法
</script>
</body>
</html>