箭头函数中this指向的改变

Posted 十九万里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了箭头函数中this指向的改变相关的知识,希望对你有一定的参考价值。

函数的this指向只与其 申明函数的作用域和调用路径有关系

函数的this与调用路径的关系

正常情况下this指向调用其的对象


   
  1. let c = { a: 123}
  2. c.b = function(){ console.log( this.a) }
  3. c.b() //123

哪怕不是在该对象下申明的函数,在该对象下调用也是指向该对象


   
  1. let c = { a: 123}
  2. c.b = function(){ console.log( this.a) }
  3. let q = { a: 321}
  4. q.b = c.b //获取在c中声明的函数b的地址
  5. q.b() //321

 

传统function函数的this指向在函数调用的时候决定,a调用指向a,b调用指向b

箭头函数不是在调用的时候决定this,而是在箭头函数 申明 的时候,就指定了this,指向上层 父作用域 的this,如果父作用域没有this,则依次往上

window下申明,window下调用func


   
  1. let c = { a: 123}
  2. window.a = 321
  3. let func = () => { console.log( this.a) } //func在window下申明,this指向父作用域this,window
  4. c.b = function(){
  5. func()
  6. }
  7. c.b() //321

其他对象下申明,window下调用func


   
  1. let c = { a: 123}
  2. let func
  3. c.b = function(){
  4. func = () => { console.log( this.a) } //func在c.b下申明,this指向父作用域this,c
  5. }
  6. c.b()
  7. func() //123

其他对象下申明调用func


   
  1. let c = { a: 123}
  2. let b = { a: 331}
  3. c.f = function(){
  4. b.func = () => { console.log( this.a) }
  5. }
  6. c.f()
  7. b.func() //123

循环箭头函数


   
  1. let a = { b:{ c:{}}}
  2. a.b.c.funcC = function(){
  3. console.log( 'c', this)
  4. a.funcA = () => {
  5. console.log( 'a', this)
  6. a.b.funcB()
  7. }
  8. a.funcA()
  9. }
  10. a.b.funcB = () => { console.log( 'b', this) }
  11. a.b.c.funcC()
  12. //c { funC... }
  13. //a { funC... }
  14. //b Window

再次强调 箭头函数的this在箭头函数申明时就已经绑定到内部,不会被外部影响改变, call 和 apply 方法对箭头函数无效


   
  1. window.a = 312
  2. let func = () => { console.log( this.a)}
  3. let c = { a: 123,func}
  4. func() // 312
  5. c.func() // 312
  6. func.apply(c) //312
  7. func.call(c) //312

 

以上是关于箭头函数中this指向的改变的主要内容,如果未能解决你的问题,请参考以下文章

箭头函数中this指向的改变

怎么理解这个箭头函数里的this指向

js--call箭头函数/匿名函数

ES6 箭头函数

vue 中的this问题

面试题系列---箭头函数和普通函数的区别?箭头函数的优缺点?