# 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() ```