## **this**
`this` 其实一点都不难,他只有几个规则。
```
// 全局变量a
// let 就算在全局声明也不会挂载到window上
// 并且 let 不会 变量提升 而 var会
// 所以这里用var说明问题
var a = '全局变量'
function foo () {
console.log(this.a)
}
foo() // 全局变量
// obj变量a属性
var obj = {
a: 'obj变量',
foo: foo
}
obj.foo() // obj变量
```
上面是普通调用,`this` 永远指向调用他的对象。
下面是优先级最高的 `this` 指向。
```
function foo () {
// 这里的this指向通过new 操作符的对象实例
// 也就是这里的c
console.log(this.a)
}
var c = new foo()
// 需要给实例c 添加 a 属性 否则是undefined
c.a = 3
console.log(c.a)
// 还有种就是利用 call,apply,bind 改变 this,这个优先级仅次于 new
```
`ES5`就只有上面几种情况,另外就是函数里面的函数`this`是指向`window`的
`ES6`还有一种箭头函数,下面让我们看看箭头函数中的 `this`
```
function a () {
return () => {
return () => {
console.log(this)
}
}
}
a()()()
```
箭头函数其实是没有 `this` 的,这个函数中的 `this` 只取决于他外面的第一个不是箭头函数的函数的 `this`。在这个例子中,因为调用 `a` 符合前面代码中的第一个情况,所以 `this` 是 `window`。并且 `this` 一旦绑定了上下文,就不会被任何代码改变。就是说是最高优先级。