提问者:小点点

垃圾收集会从JS中的构造中移除变量吗?


对于本例:

export class DummyClass{  
  constructor(container) {
    const wrapper: HTMLElement = document.createElement("div");
    wrapper.innerHTML = 'x';

    container.append(wrapper);
  }
}

new DummyClass(document.querySelector('body'));

创建DummyClass的新实例后,是否删除了“包装器”变量并释放了内存?


共2个答案

匿名用户

是的,它的发生是因为JS的工作方式:

当函数返回/结束其计算时,它的内存块将从调用堆栈中移除。

一个小例子:

 var a;
 function myF(){
    // do stuff
 }();

在函数调用之前,调用堆栈将如下所示:

-------
|  A  |
-------

那么当调用函数时:

-------
| myF |
-------
|  A  |
-------

当函数执行结束时:

-------
|  A  |
-------

调用堆栈中不会留下任何局部变量的跟踪。

你可以在这篇文章中找到更多的信息

匿名用户

const wrapper: HTMLElement = document.createElement("div");

由此创建的

将继续存在于内存中,只要有某种方式可以从内存的根访问它。 一旦构造函数运行完毕,wrapper变量就会被清除,这样就少了一种引用div的方式。

然而,这并不是引用div的唯一内容。 您已经将div附加到body元素,因此body现在将有一个对它的引用,作为它的子元素之一。 如果这种情况持续下去,div将无法被清除(您也不希望它被清除,因为它对用户是可见的)。