来自类 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() 方法一样。该值未在任何地方附加。

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