关于箭头函数改变this指向

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

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

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

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

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

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

 

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

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

window下申明,window下调用func

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

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

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

其他对象下申明调用func

let c = {a:123}
let b = {a:331}
c.f = function(){
  b.func = () => { console.log(this.a) }
}
c.f()
b.func() //123

循环箭头函数

let a = {b:{c:{}}}
a.b.c.funcC = function(){
  console.log('c',this)
  a.funcA = () => { 
    console.log('a',this) 
    a.b.funcB()
  }
  a.funcA()
}
a.b.funcB = () => { console.log('b',this) }
a.b.c.funcC()

//c { funC... }
//a { funC... }
//b Window

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

window.a = 312
let func = () => {console.log(this.a)}
let c = {a:123,func}
func()   // 312
c.func() // 312

func.apply(c) //312
func.call(c)  //312

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值