JS 对象方法丢失 this

先来看一个问题:

let user = {
  name: "John",
  hi() { console.log(this.name); }
};

(user.hi)(); //(1)

let hi = user.hi;
hi(); //(2)

(user.name == "John" ? user.hi : user.bye)();  //(3)

(1)(2)(3) 分别输出什么?为什么?


运行一下代码,从结果可以看到,(2)和(3)丢失了this,(1)没有。

(1) 先执行了'.' 取了属性 user.hi 的值,然后()执行了它。事实上,这里'.' 运算返回的不是一个函数,而是一个特殊的 Reference Type 的值。

Reference TypeECMA 中的一个“规范类型”,它被用在 JavaScript 语言内部,不能直接使用。它是一个三个值的组合 (base, name, strict),其中:

  • base 是对象。
  • name 是属性名。
  • strictuse strict 模式下为 true

Reference Type调用(),能够传递对象方法和源对象,得到正确的this

进行任何其它操作,Referenct Type都会自动变成属性name的值,丢失其它信息。所以任何使用表达式从对象动态地获取一个方法的操作,都会导致this的丢失。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值