### 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` 一旦綁定了上下文,就不會被任何代碼改變。就是說是最高優先級。