微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自类 get 方法的返回值是否被垃圾收集?

如何解决来自类 get 方法的返回值是否被垃圾收集?

假设我有一个带有方法 calculatePrice 的类,它返回一个值。它还有另一种使用 calculatePrice方法

class SodaCan {

  constructor(id,otherArgs) { 
    this.id = id
    // more constructor logic
  }

  calculatePrice() {
    // do some calculations for tax,recycling,whatever
    return price;
  }

  savePricetoDb() {
    const price = this.calculatePrice();
    database.save(this.id,{ price });
  }

}

// in the global scope:
const coke = window.coke = new SodaCan('someId',1.19)
coke.savePricetoDb();

一旦 savePricetoDb 完成执行,就不再有对 price 的引用,所以我的假设是 price垃圾收集。但是,coke.id 不会被垃圾回收,因为它是 coke一个属性,可在全局范围内使用。如果这是不正确的,请告诉我!

现在假设我们将 calculatePrice 更改为 get 方法,例如 get price

class SodaCan {

  constructor(id,otherArgs) { 
    this.id = id
    // more constructor logic
  }

  get price() {
    // do some calculations for tax,whatever
    return price;
  }

  savePricetoDb() {
    const price = this.price;
    database.save(this.id,1.19)
coke.savePricetoDb();

(授予 savePricetoDb 函数实际上不需要说 const price = this.price,因为它可以只调用 database.save(this.id,{ price: this.price })

使用 get 语法,this.price 的结果附加到实例。由于 coke 在全局范围内可用,coke.price 仍然会引用它,并且不会垃圾收集。对吗?

如果我的假设是正确的,就内存管理而言,这是在类上使用 get 方法的缺点吗?如果我不理解这里的某些内容,或者我的假设不正确,请告诉我。

解决方法

使用 get 语法,将 this.price 的结果附加到实例。

不,不是。 getter 只是让它看起来像值是一个属性,但事实并非如此。每次读取 this.price 时,它都会调用 getter 函数并返回值,就像 calculatePrice() 方法一样。该值未在任何地方附加。

所以如果调用者不在任何地方保存价格,它就会变成垃圾。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。