前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入了解引用类型

深入了解引用类型

作者头像
公众号---人生代码
发布2021-03-16 14:34:40
2610
发布2021-03-16 14:34:40
举报
文章被收录于专栏:人生代码

本文将介绍一个高级主题,以便更好地理解某些边缘情况。

那并不重要。许多有经验的开发人员在不知情的情况下过得很好。如果你想知道事情是如何运作的,请继续读下去。

动态计算的方法调用可能会丢失这一点。

例如:

代码语言:javascript
复制
let user = {
  name: "John",
  hi() { alert(this.name); },
  bye() { alert("Bye"); }
};

user.hi(); // works

// now let's call user.hi or user.bye depending on the name
(user.name == "John" ? user.hi : user.bye)(); // Error!

最后一行有一个条件操作符,用于选择其中任何一个user.hi或user.bye。在本例中,结果是user.hi。

然后立即用圆括号()调用该方法。但是它不能正常工作!

如您所见,调用会导致错误,因为调用中的“this”的值没有定义。

这个工作原理(对象点方法):

代码语言:javascript
复制
user.hi();

这无法运行

代码语言:javascript
复制
(user.name == "John" ? user.hi : user.bye)(); // Error!

为什么?如果我们想要理解为什么会发生这种情况,让我们来了解一下obj.method()调用是如何工作的。

引用类型解释

仔细观察,我们可能会注意到obj.method()语句中的两个操作:

  • 首先是.检索obj.method属性。
  • 然后括号()执行它。

那么,关于这个的信息是如何从第一部分传递到第二部分的呢?

如果我们把这些操作放在单独的行中,那么这个肯定会丢失:

代码语言:javascript
复制
let user = {
  name: "John",
  hi() { alert(this.name); }
}

// split getting and calling the method in two lines
let hi = user.hi;
hi(); // Error, because this is undefined

这里hi = user.hi将函数放入变量中,然后在最后一行它是完全独立的,所以没有 this

为了让user.hi()调用起作用,JavaScript使用了一个技巧——点。'返回的不是函数,而是特殊引用类型的值。

引用类型是一个“规范类型”。我们不能明确地使用它,但它是由语言内部使用的。

引用类型的值是一个三值组合(base、name、strict),其中:

  • base是对象。
  • name是属性名。
  • 如果使用strict有效,则strict为真。

属性访问user.hi的结果不是函数,而是引用类型的值。user.hi在严格模式下是:

代码语言:javascript
复制
// Reference Type value
(user, "hi", true)

当在引用类型上调用括号()时,它们接收到关于对象及其方法的完整信息,并可以设置正确的this(在本例中为user)。

引用类型是一种特殊的“中介”内部类型,用于从dot传递信息。调用圆括号()。

任何其他操作,如赋值hi = user.hi作为一个整体丢弃引用类型,取user.hi(一个函数)并传递它。所以任何进一步的手术都会失去这个。

因此,作为结果,只有在使用点obj.method()或方括号obj['method']()语法直接调用函数时,this的值才会以正确的方式传递(在这里它们做的是相同的)。有很多方法可以解决这个问题,比如function .bind()

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CryptoCode 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用类型解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档