📜  javascript中的对象销毁(1)

📅  最后修改于: 2023-12-03 14:42:40.523000             🧑  作者: Mango

JavaScript中的对象销毁

在JavaScript中,对象销毁是自动进行的,通过垃圾回收器来实现。当一个对象不再被引用时,垃圾回收器会把它自动销毁。

引用计数

在垃圾回收器出现之前,Javascript使用的是引用计数的方式来管理内存。每个对象都会有一个引用计数器,当有一个变量引用该对象时,引用计数器就加1,变量取消引用时,引用计数器就减1。当引用计数器为0时,对象就可以被销毁了。

但是,引用计数的方式存在一些问题。例如,如果有两个对象相互引用,这时它们的引用计数器将无法降为0,导致内存泄漏。

标记清除

垃圾回收器采用的是标记清除的方式。垃圾回收器会定期扫描内存中所有的对象,将所有被引用的对象标记,然后清除那些未被标记的对象。

垃圾回收器有两个基本概念:根和可达对象。根是全局上下文和当前函数的所有变量,可达对象是被根引用或相互引用的对象。

当垃圾回收器扫描内存时,一开始所有对象都是未标记的。从根开始,垃圾回收器会标记所有被引用的对象。然后,它会检查对象是否存在于内存中。对于未被标记的对象,它们就会被清除。

内存泄漏

尽管JavaScript自动进行垃圾回收,但在编写代码时仍然需要注意内存泄漏的问题。内存泄漏指当一个对象不再被使用时,没有被垃圾回收器自动清理,而一直占据内存。

以下是一些可能导致内存泄漏的情况:

  • 全局变量:在全局作用域中定义的变量可能会导致内存泄漏。
  • 闭包:闭包中定义的变量可能会导致内存泄漏。
  • 循环引用:当两个对象相互引用时,它们的引用计数器将无法降为0,导致内存泄漏。
总结

JavaScript中的对象销毁是通过垃圾回收器自动实现的,采用的是标记清除的方式。尽管JavaScript自动进行垃圾回收,但在编写代码时仍需注意内存泄漏的问题。