# this 指向
## 什么是 this
this 是执行期上下文中的一个属性，设计目的是在函数体内部指代函数当前的运行环境，以方便引用当前环境的其他变量

## 判断this指向的规则
**谁(对象)调用 就指向谁**
如果没在对象里面 this就指向全局window（全局对象）
如果在对象中，this指代的是当前对象实例，
箭头函数例外，他的函数内部没有this 在执行到this的时候会去找外部对象 所以 箭头函数的this最终就指向他外一层的对象  当他只有一层的时候  this会指向全局对象 window

思考下面的代码 会输出什么
```
var aaa=1;
var c=3
  function fn(){
      aaa=6
        console.log(this.aaa)
    }
var obj={
    aaa:222,
    fn:function(){
        console.log(this.aaa)
    }
    fn1:()=>{
        console.log(this.aaa)
    }
}
fn()
obj.fn() //222
obj.fn1()  //1
console.log(this.c) //this==> window
console.log(c) = console.log(window.c)
```

# call 和 apply (改变this指向)
### call
作用 ：改变this的指向
语法： B.方法名.call(A,n,m...)
这个方法本来是B拥有的，方法中的this 指向的也是B  
执行完这句call 之后， 方法中的this 指向A
所以说A用了这个方法



```
  var cat={
            name:"大喵",
            run:function(){
                console.log("我会跑")
            },
            eat(){
                console.log("我在吃东西")
            }
        };

        var dog={
            name:"大汪",
            bark(){
                console.log("汪汪汪")
            },
            paqiang(){
                console.log(this)
                console.log("我能爬墙")
            }
        }

        // 大喵需要借用大汪的paqiang的技能
        dog.paqiang.call(cat)
        dog.paqiang()

        //让别人用自己的技能
        dog.paqiang.call(cat)
        paqiang 是dog有的技能
        this指向也变成猫了
```

### apply
apply 的作用和call 是完全一样的都是改变this的指向
语法： B.方法名.apply(A,[n,m...])
这个方法本来是B拥有的，方法中的this 指向的也是B 
执行完这句apply 之后， 方法中的this 指向A
所以说A用了这个方法
上面的问题也可以用下面的方式解决：
```
   var cat={
            name:"大喵",
            run:function(){
                console.log("我会跑")
            },
            eat(){
                console.log("我在吃东西")
            }
        };

        var dog={
            name:"大汪",
            bark(){
                console.log("汪汪汪")
            },
            paqiang(m,n){
                console.log(this)
                console.log(m,n,"我能爬墙")
            }
        }

        // 大喵需要借用大汪的paqiang的技能
        // dog.paqiang.call(cat,1,2)  这是call实现的
        dog.paqiang.apply(cat,[1,2]) //这是用apply实现的
        dog.paqiang()

```