代码之家  ›  专栏  ›  技术社区  ›  mco

在javascript中,将一个对象传递给另一个类是否会导致内存泄漏?

  •  -2
  • mco  · 技术社区  · 6 年前

    如果类A有一个对象并将其传递给类B,是否会阻止类A进行垃圾收集,因为类B引用了类A中的对象?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nikita Malyschkin    6 年前

    TLDR
    对象A将被垃圾回收。

    为什么?
    好吧,javascript中的每个对象只在有对该对象的引用时才存在。因为在某个点上没有对对象A的引用,所以它将被删除。但共享对象,我们称之为对象C,从来不是对象A“拥有”的,对象A只引用了对象C。因为B仍然引用了C,所以C不会被删除。

    非引用类型呢?
    虽然引用类型从未拥有,而是作为引用存在,但原始类型A由其父类型拥有。

    a = { x: "lorem ipsum" };
    b = { y: a.x };
    

    这意味着在上面的示例中,字符串“lorem ipsum”在内存中保存了两次。如果对象A被删除,那么字符串也是。这不会影响b,因为字符串是按值复制的,这意味着它是第二次写入内存。

    运行时如何知道引用了什么对象?
    每次gc启动时,它都会开始标记可由顶级作用域中的引用访问的所有对象。在此进程中未标记的所有内容都将被删除(在某种程度上,取决于正在运行的GC的类型)。

    推荐文章