题目如下
```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 函数内部未执行,所以执行外面的
getName()//4 其实就是预解析的愿意,函数的优先级更高,所以var就改变了后面的内容
Foo().getName()//1 函数执行,执行里面的getname
getName()//1 因为上面的 Foo().getName() 执行, 里面的 getName 替换了外面的 getName 函数到全局上,所有执行的是 Foo 内部的 getName
new Foo.getName()//2 因为:. 的优先级比 new 高,所以这里就是一个次 Foo.getName() 调用,所以是 2 ,new 是误导用的
new Foo().getName()//3 因为:new Foo() 加个括号,是提升了优先级,会去先执行 new Foo(), 然后在调用 .getName(), 那问题又来了,为啥不是 1,因为内部的 getName 不是绑定在 this 上的呀,所以就去找原型上的方法,结果是 3
重点1:js预解析
在JS中,使用var声明的变量和具名函数存在声明作用域提升的特性,var声明的变量和具名函数的声明部分会提升到作用域的最前面。
```var a=function() { console.log(4) }
function a() { console.log('1212312') }
console.log(a)//4
1、首先会声明a 的函数
2、 接下来提升var 的变量,但是var的变量和function的名称一样,所以js会忽略a的声明
3、 执行a() 开始执行函数,所以最后的结果为4
重点2:var的作用域
var a=1
function f(){
var a=2
}
f()
console.log(a)
注意:函数里面的a如果没有var,最后输出结果为2,因为函数内改变的是全局变量