Typescript(Angular2):将对象传递给函数 - >可能的内存泄漏?

时间:2017-04-26 09:51:59

标签: javascript angular object memory-leaks pass-by-reference

我已经读过,当在javascript中传递对象作为参数时(也在Typescript中继承),它通过引用传递。

这可能导致内存泄漏吗?

让我们假设一个场景:

  1. 以下组件执行saveCustomerInfo函数
  2. 然后该函数将对象推入数组中。
  3. 组件被破坏。
  4. 
    
    @Component({
        selector: "customer-details",
        templateUrl: "../html/customerDetails.template.html"
    })
    export class CustomerDetailsComponent {
      customerData: Customer;
    
      constructor(private customerService: CustomerService): void {}
     
      saveCustomerInfo(): void {
        this.customerService.saveCustomer(this.customerData);
      }
    }
    
    
    

    不会导致内存泄漏,因为该服务现在已经保存了Component的属性的引用,不允许对Component进行垃圾回收?

    无论如何,这种电话的最佳做法是什么?我们是否应该仅通过" let"传递在函数内声明的临时对象。或者传递由Object.create()创建的克隆?

    非常感谢您提前,

    迪米瑞斯

2 个答案:

答案 0 :(得分:1)

@Component({
    selector: "customer-details",
    templateUrl: "../html/customerDetails.template.html"
})
export class CustomerDetailsComponent {
  customerData: Customer;

  constructor(private customerService: CustomerService): void {}

  saveCustomerInfo(): void {
    this.customerService.saveCustomer(this.customerData);
  }
}

在您的示例代码中,根据您在其余问题中描述的内容,我假设customerService.saveCustomer(customerData)调用最终将其参数(customerData)放入内部数组中。

这正确意味着customerData对象不会被垃圾收集,因为现在您的customerService对象具有对它的引用。但是,虽然customerData对象不能被垃圾收集,但是CustomerDetailsComponent的其余部分可以被垃圾收集而不会出现问题 - 其他人对其内部属性之一的引用这一事实意味着特定属性赢得了'标记为垃圾收集,但对象的其余部分仍然可以进行垃圾收集(假设没有其他人持有对组件本身的引用)。

答案 1 :(得分:0)

"当Angular看到DOM中不再需要某个组件时,它会破坏组件。"

基本上,当不需要组件时,会调用ngDestroy()。

在这种情况下,您可以通过在组件上实现生命周期挂钩来实际测试以查看组件是否被销毁,如上所述进行调用,然后移动到组件不在的新视图中在DOM中。

组件应该被销毁得很好。