this的理解

var obj = {
  foo: function(){
    console.log(this)
  }
}

var bar = obj.foo
obj.foo() // 打印出的 this 是 obj
bar() // 打印出的 this 是 window

我很疑惑,直到找到大佬的解释:
ES5里有第三种函数调用的方式:

  1. func(p1, p2)
  2. obj.child.method(p1, p2)
  3. func.call(context, p1, p2) // 先不讲 apply

初学者常用的是前两种,但其实第三种才是正常的调用形式,前两种是语法糖,都是可以转化成第三种的

func(p1, p2) 等价于
func.call(undefined, p1, p2)

obj.child.method(p1, p2) 等价于
obj.child.method.call(obj.child, p1, p2)

比如:

function func(){
  console.log(this)
}

func()
转化为:
func.call(undefined) // 可以简写为 func.call()
按理说打印出来的 this 应该就是 undefined 了吧,但是浏览器里有一条规则:
如果你传的 context 是 null 或 undefined,那么 window 对象就是默认的 context(严格模式下默认 context 是 undefined)
因此上面的打印结果是 window。

那么一开始的代码就可以理解了,obj.foo() 就相当于obj.child.method(p1, p2) ,可以转化成obj.child.method.call(obj.child, p1, p2),此处即obj.foo.call(obj)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值